CMake动态链接`/ usr / local / lib`中的`.a`文件

mor*_*och 3 c++ cmake

我想针对另一个静态库对程序进行静态编译,对于本示例,我正在使用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被动态链接?

was*_*ful 6

您不应直接使用该路径,而应创建一个导入的目标,因此可以将其显式声明为静态:

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源代码具有答案

如果目标不是静态库,请确保链接类型是共享的。这是因为动态模式链接可以处理共享库和静态库,但是静态模式只能处理静态库。如果先前的用户项将链接类型更改为静态,则需要确保它已恢复为共享。

本质上,如果当前处于动态模式,则让链接器处理程序检测库是否为静态。