我想针对另一个静态库对程序进行静态编译,对于本示例,我正在使用zeromq。这是我的CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
add_executable( test test.cpp )
find_library(ZMQ NAMES libzmq.a)
message(STATUS ${ZMQ})
target_link_libraries( test ${ZMQ} )
Run Code Online (Sandbox Code Playgroud)
.a我运行时会找到文件mkdir build && cd build && cmake ..
-- /usr/local/lib/libzmq.a
Run Code Online (Sandbox Code Playgroud)
但是,如果我检查link.txt文件,该库是动态链接的:
/usr/bin/c++ CMakeFiles/test.dir/test.cpp.o \
-o test -rdynamic /usr/local/lib/libzmq.a
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我将文件移动到另一个目录,说/usr/lib再运行cmake ..一次,它将找到该库的新路径:
-- /usr/lib/libzmq.a
Run Code Online (Sandbox Code Playgroud)
但是现在它神奇地变成了静态链接:
/usr/bin/c++ CMakeFiles/test.dir/test.cpp.o \
-o test -rdynamic -Wl,-Bstatic -lzmq -Wl,-Bdynamic
Run Code Online (Sandbox Code Playgroud)
同样的事情也适用于我链接到的其他库。
为什么我所有的库都/usr/local/lib被动态链接?
您不应直接使用该路径,而应创建一个导入的目标,因此可以将其显式声明为静态:
cmake_minimum_required(VERSION 2.6)
add_executable( test test.cpp )
find_library(zmq_location NAMES libzmq.a)
message(STATUS ${zmq_location})
add_library(zmq STATIC IMPORTED)
set_target_properties(zmq PROPERTIES IMPORTED_LOCATION ${zmq_location})
target_link_libraries( test zmq )
Run Code Online (Sandbox Code Playgroud)
这可能会导致库似乎是动态链接的,但是cmake源代码具有答案:
如果目标不是静态库,请确保链接类型是共享的。这是因为动态模式链接可以处理共享库和静态库,但是静态模式只能处理静态库。如果先前的用户项将链接类型更改为静态,则需要确保它已恢复为共享。
本质上,如果当前处于动态模式,则让链接器处理程序检测库是否为静态。