CMake link library from find_package与system lib顺序错误



我的CMakeLists.txt如下

find_pacakge(something)
add_executable(exe main.cc)
# libsomething depends on dlopen/dlsym... so I have to add dl here
target_link_libraries(run PRIVATE something::something dl)

结果:

g++ -o exe -ldl path/to/libsomething.a
libsomething.c: undefined reference to `dlsym'

但是CMake总是在libsomething之前放-ldl标志。a我也试过了:

target_link_libraries(run PRIVATE dl something::something dl something::something )
# produced output:
# g++ -o exe -ldl -ldl path/to/libsomething.a
# libsomething.c: undefined reference to `dlsym'

target_link_libraries(run PRIVATE dl)
target_link_libraries(run PRIVATE something::something)
target_link_libraries(run PRIVATE dl)
# produced output:
# g++ -o exe -ldl -ldl path/to/libsomething.a
# libsomething.c: undefined reference to `dlsym'

但是构建程序的正确方法是

$ g++ -o exe path/to/libsomething.a -ldl

如何解决这个问题?

评论

# libsomething depends on dlopen/dlsym... so I have to add dl here

显示核心问题是:libsomething需要与dl联动,所以它的find_package(something)应该关心这个。缺少这种链接是库本身的缺陷(即错误).

如果你是这个库的作者,那么修复它。如果库的作者接受bug报告,则填写关于给定问题的报告。

如果修复库不是您的选项,那么您可以"fix"find_package在你的项目中的结果:

find_package(something)
# Created imported target misses linkage with 'dl' library.
# Add it here.
target_link_libraries(something::something INTERFACE ${CMAKE_DL_LIBS})
add_executable(exe main.cc)
# Now we can use the library in a simple way
target_link_libraries(exe PRIVATE something::something)

上面的代码依赖于这样一个事实,即find_package(something)提供的something::something是一个导入的目标,表示库文件。所以我们可以添加必要的链接。

最新更新