cmake动态库编译和链接linux
创始人
2025-06-01 19:18:57

在102cmake_lib目录下新建一个CMakeLists.txt

wj@wj:~/cmake/cmake_learn/102cmake_lib$ ls

CMakeLists.txt test_xlog xlog

首先新建一个CMakeLists.txt

#CMakeLists.txt test_xlog xlog
cmake_minimum_required(VERSION 3.20)
project(xlog)
add_library(xlog SHARED xlog/xlog.cpp)
add_executable(test_xlog test_xlog/test_xlog.cpp xlog)

wj@wj:~/cmake/cmake_learn/102cmake_lib$ cmake -S . -B build
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/wj/cmake/cmake_learn/102cmake_lib/build
wj@wj:~/cmake/cmake_learn/102cmake_lib$ ls
build  CMakeLists.txt  test_xlog  xlog

编译的时候报错。

wj@wj:~/cmake/cmake_learn/102cmake_lib$ cmake --build build
[ 25%] Building CXX object CMakeFiles/xlog.dir/xlog/xlog.cpp.o
[ 50%] Linking CXX shared library libxlog.so
[ 50%] Built target xlog
[ 75%] Building CXX object CMakeFiles/test_xlog.dir/test_xlog/test_xlog.cpp.o
/home/wj/cmake/cmake_learn/102cmake_lib/test_xlog/test_xlog.cpp:2:10: fatal error: xlog.h: 没有那个文件或目录2 | #include "xlog.h"|          ^~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/test_xlog.dir/build.make:76:CMakeFiles/test_xlog.dir/test_xlog/test_xlog.cpp.o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:111:CMakeFiles/test_xlog.dir/all] 错误 2
make: *** [Makefile:91:all] 错误 2

修改CMakeLists.txt

#CMakeLists.txt test_xlog xlog
cmake_minimum_required(VERSION 3.20)
project(xlog)
include_directories("xlog") #增加头文件路径
add_library(xlog SHARED xlog/xlog.cpp)
add_executable(test_xlog test_xlog/test_xlog.cpp xlog)

继续编译运行:

wj@wj:~/cmake/cmake_learn/102cmake_lib$ cmake -S . -B build
-- Configuring done
-- Generating done
-- Build files have been written to: /home/wj/cmake/cmake_learn/102cmake_lib/build
wj@wj:~/cmake/cmake_learn/102cmake_lib$ cmake --build build
Consolidate compiler generated dependencies of target xlog
[ 50%] Built target xlog
Consolidate compiler generated dependencies of target test_xlog
[ 75%] Linking CXX executable test_xlog
/usr/bin/ld: CMakeFiles/test_xlog.dir/test_xlog/test_xlog.cpp.o: in function `main':
test_xlog.cpp:(.text+0x2a): undefined reference to `XLog::XLog()'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/test_xlog.dir/build.make:97:test_xlog] 错误 1
make[1]: *** [CMakeFiles/Makefile2:111:CMakeFiles/test_xlog.dir/all] 错误 2
make: *** [Makefile:91:all] 错误 2

继续修改CMakeLists.txt 成为下面这样。

#CMakeLists.txt test_xlog xlog
cmake_minimum_required(VERSION 3.20)
project(xlog)
#include_directories("xlog") #增加头文件路径
add_library(xlog SHARED xlog/xlog.cpp)
#add_executable(test_xlog test_xlog/test_xlog.cpp xlog)

编译运行:可以看到libxlog.so动态库已经生成了。

wj@wj:~/cmake/cmake_learn/102cmake_lib$ cmake -S . -B build
-- Configuring done
-- Generating done
-- Build files have been written to: /home/wj/cmake/cmake_learn/102cmake_lib/build
wj@wj:~/cmake/cmake_learn/102cmake_lib$ cmake --build build
Consolidate compiler generated dependencies of target xlog
[ 50%] Building CXX object CMakeFiles/xlog.dir/xlog/xlog.cpp.o
[100%] Linking CXX shared library libxlog.so
[100%] Built target xlog
wj@wj:~/cmake/cmake_learn/102cmake_lib$ cd build/
wj@wj:~/cmake/cmake_learn/102cmake_lib/build$ ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  libxlog.a  libxlog.so  Makefile

继续修改CMakeLists.txt 成为下面这样。

#CMakeLists.txt test_xlog xlog
cmake_minimum_required(VERSION 3.20)
project(xlog)
#include_directories("xlog") #增加头文件路径
add_library(xlog SHARED xlog/xlog.cpp)
#add_executable(test_xlog test_xlog/test_xlog.cpp xlog)
add_executable(test_xlog test_xlog/test_xlog.cpp)

编译如下:编译报错,xlog.h头文件报错

wj@wj:~/cmake/cmake_learn/102cmake_lib$ cmake -S . -B build
-- Configuring done
-- Generating done
-- Build files have been written to: /home/wj/cmake/cmake_learn/102cmake_lib/build
wj@wj:~/cmake/cmake_learn/102cmake_lib$ cmake --build build
Consolidate compiler generated dependencies of target xlog
[ 50%] Built target xlog
Consolidate compiler generated dependencies of target test_xlog
[ 75%] Building CXX object CMakeFiles/test_xlog.dir/test_xlog/test_xlog.cpp.o
/home/wj/cmake/cmake_learn/102cmake_lib/test_xlog/test_xlog.cpp:2:10: fatal error: xlog.h: 没有那个文件或目录2 | #include "xlog.h"|          ^~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/test_xlog.dir/build.make:76:CMakeFiles/test_xlog.dir/test_xlog/test_xlog.cpp.o] 错误 1
make[1]: *** [CMakeFiles/Makefile2:111:CMakeFiles/test_xlog.dir/all] 错误 2
make: *** [Makefile:91:all] 错误 2

修改CMakeLists.txt ,增加头文件路径,修复编译报错:

#CMakeLists.txt test_xlog xlog
cmake_minimum_required(VERSION 3.20)
project(xlog)
include_directories("xlog") #增加头文件路径
add_library(xlog SHARED xlog/xlog.cpp)
#add_executable(test_xlog test_xlog/test_xlog.cpp xlog)
add_executable(test_xlog test_xlog/test_xlog.cpp)

再次编译如下,可以看到编译没有问题,但是链接出现问题了:

wj@wj:~/cmake/cmake_learn/102cmake_lib$ cmake -S . -B build
-- Configuring done
-- Generating done
-- Build files have been written to: /home/wj/cmake/cmake_learn/102cmake_lib/build
wj@wj:~/cmake/cmake_learn/102cmake_lib$ cmake --build build
Consolidate compiler generated dependencies of target xlog
[ 25%] Building CXX object CMakeFiles/xlog.dir/xlog/xlog.cpp.o
[ 50%] Linking CXX shared library libxlog.so
[ 50%] Built target xlog
Consolidate compiler generated dependencies of target test_xlog
[ 75%] Building CXX object CMakeFiles/test_xlog.dir/test_xlog/test_xlog.cpp.o
[100%] Linking CXX executable test_xlog
/usr/bin/ld: CMakeFiles/test_xlog.dir/test_xlog/test_xlog.cpp.o: in function `main':
test_xlog.cpp:(.text+0x2a): undefined reference to `XLog::XLog()'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/test_xlog.dir/build.make:97:test_xlog] 错误 1
make[1]: *** [CMakeFiles/Makefile2:111:CMakeFiles/test_xlog.dir/all] 错误 2
make: *** [Makefile:91:all] 错误 2

修改链接错误,增加链接库路径:

#CMakeLists.txt test_xlog xlog
cmake_minimum_required(VERSION 3.20)
project(xlog)
include_directories("xlog") #增加头文件路径
add_library(xlog SHARED xlog/xlog.cpp)
#add_executable(test_xlog test_xlog/test_xlog.cpp xlog)
add_executable(test_xlog test_xlog/test_xlog.cpp)
target_link_libraries(test_xlog xlog)

编译运行如下:

wj@wj:~/cmake/cmake_learn/102cmake_lib$ cmake -S . -B build
-- Configuring done
-- Generating done
-- Build files have been written to: /home/wj/cmake/cmake_learn/102cmake_lib/build
wj@wj:~/cmake/cmake_learn/102cmake_lib$ cmake --build build
Consolidate compiler generated dependencies of target xlog
[ 50%] Built target xlog
Consolidate compiler generated dependencies of target test_xlog
[ 75%] Linking CXX executable test_xlog
[100%] Built target test_xlog
wj@wj:~/cmake/cmake_learn/102cmake_lib$ ls
build  CMakeLists.txt  test_xlog  xlog
wj@wj:~/cmake/cmake_learn/102cmake_lib$ cd build/
wj@wj:~/cmake/cmake_learn/102cmake_lib/build$ ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  libxlog.a  libxlog.so  Makefile  test_xlog
wj@wj:~/cmake/cmake_learn/102cmake_lib/build$ ./test_xlog 
Create XLog
test xlog

查看test_xlog依赖的动态库:

wj@wj:~/cmake/cmake_learn/102cmake_lib/build$ ldd test_xloglinux-vdso.so.1 (0x00007ffecb376000)libxlog.so => /home/wj/cmake/cmake_learn/102cmake_lib/build/libxlog.so (0x00007ff84ee17000)libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff84ec21000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff84ea2f000)libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff84e8e0000)/lib64/ld-linux-x86-64.so.2 (0x00007ff84ee23000)libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff84e8c5000)

将test_xlog移动到 ~目录下,然后执行,如下所示:

wj@wj:~/cmake/cmake_learn/102cmake_lib/build$ cp test_xlog ~/
wj@wj:~/cmake/cmake_learn/102cmake_lib/build$ cd ~
wj@wj:~$ ls
公共的  模板  视频  图片  文档  下载  音乐  桌面  bin  cmake  snap  SSD_1T  test_xlog  WORK
wj@wj:~$ ./test_xlog 
Create XLog
test xlog
wj@wj:~$ ldd test_xlog linux-vdso.so.1 (0x00007fff3ad13000)libxlog.so => /home/wj/cmake/cmake_learn/102cmake_lib/build/libxlog.so (0x00007ff00d62a000)libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff00d434000)libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff00d242000)libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff00d0f3000)/lib64/ld-linux-x86-64.so.2 (0x00007ff00d636000)libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff00d0d8000)

相关内容

热门资讯

实测分享“微竞星梦透视作弊软件... 您好,微竞星梦这个游戏其实有挂的,确实是有挂的,需要了解加客服微信【63550187】很多玩家在云梦...
重大通报“龙神是不是有挂 ”插... 您好:龙神这款游戏可以开挂,确实是有挂的,需要软件加微信【6676724】很多玩家在这款游戏中打牌都...
科普实测“新皇豪拼三张其实真有... 您好:新皇豪拼三张这款游戏可以开挂,确实是有挂的,需要软件加微信【4770480】,很多玩家在新皇豪...
经验总结“福州十八扑到底有挂吗... 您好:福州十八扑这款游戏可以开挂,确实是有挂的,需要了解加客服微信【6670747】很多玩家在这款游...
今日重大通报“中至窝龙究竟有没... 您好:中至窝龙这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8700483】很多玩家在中至窝龙...