如何将静态库与 cmake 链接?我尝试链接的库位于项目目录 lib/lib.a
中,唯一的源文件是 main.cpp
。库 .h
的 lib.a
文件位于 inlcude/library.h
中。
不工作我:
cmake_minimum_required(VERSION 3.16)
project(FireUp)
set(CMAKE_CXX_STANDARD 17)
link_directories(lib)
add_executable(FireUp main.cpp)
TARGET_LINK_LIBRARIES(FireUp lib.a)
输出:
-- Configuring done
-- Generating done
-- Build files have been written to: XXX/_projects/FireUp
[ 50%] Linking CXX executable FireUp
/usr/bin/ld: cannot find -l-Wl,-Bdynamic
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/FireUp.dir/build.make:84: FireUp] Error 1
make[2]: *** [CMakeFiles/Makefile2:76: CMakeFiles/FireUp.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/FireUp.dir/rule] Error 2
make: *** [Makefile:118: FireUp] Error 2
不起作用二:
cmake_minimum_required(VERSION 3.16)
project(FireUp)
set(CMAKE_CXX_STANDARD 17)
add_executable(FireUp main.cpp)
TARGET_LINK_LIBRARIES(FireUp lib/lib.a)
输出:
Scanning dependencies of target FireUp
[ 50%] Building CXX object CMakeFiles/FireUp.dir/main.cpp.o
[100%] Linking CXX executable FireUp
/usr/bin/ld: cannot find -llib/lib.a
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/FireUp.dir/build.make:103: FireUp] Error 1
make[2]: *** [CMakeFiles/Makefile2:95: CMakeFiles/FireUp.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:102: CMakeFiles/FireUp.dir/rule] Error 2
make: *** [Makefile:137: FireUp] Error 2
不起作用 III:
cmake_minimum_required(VERSION 3.16)
project(FireUp)
set(CMAKE_CXX_STANDARD 17)
add_executable(FireUp main.cpp lib/lib.a)
输出:
[ 50%] Linking CXX executable FireUp
/usr/bin/ld: CMakeFiles/FireUp.dir/main.cpp.o: in function `main':
XXX/_projects/FireUp/main.cpp:6: undefined reference to `hello()'
collect2: error: ld returned 1 exit status
make[3]: *** [CMakeFiles/FireUp.dir/build.make:103: FireUp] Error 1
make[2]: *** [CMakeFiles/Makefile2:95: CMakeFiles/FireUp.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:102: CMakeFiles/FireUp.dir/rule] Error 2
make: *** [Makefile:137: FireUp] Error 2
答案 0 :(得分:0)
将现有库添加到 cmake 就是添加一个“IMPORTED”库。
add_library(somelib STATIC IMPORTED)
set_property(TARGET somelib PROPERTY
IMPORTED_LOCATION lib/lib.a)
target_link_libraries(FireUp PRIVATE somelib)
https://cmake.org/cmake/help/git-stage/guide/importing-exporting/index.html
lib.a
看起来像一个坏名字,我建议将库命名为 lib<something_here>.a
例如 liblib.a
,以便 UNIX 编译器可以使用 -l
标志搜索它。同时研究Telling gcc directly to link a library statically .