Linker 链接到一个名为;“调试”;在cmake

Linker 链接到一个名为;“调试”;在cmake,linker,cmake,Linker,Cmake,我们正在切换到使用cmake,我正在构建的一个应用程序使用一个名为“调试”的库。(假设它位于/path/to/libdebug.so) 我意识到以下内容不起作用,因为debug是一个特殊的关键字 add_executable(myapp myapp.cpp) target_link_libraries(myapp lib1 lib2 debug lib3) 这两种方法都不管用 add_executable(myapp myapp.cpp) target_link_libraries(myapp

我们正在切换到使用cmake,我正在构建的一个应用程序使用一个名为“调试”的库。(假设它位于/path/to/libdebug.so)

我意识到以下内容不起作用,因为debug是一个特殊的关键字

add_executable(myapp myapp.cpp)
target_link_libraries(myapp lib1 lib2 debug lib3)
这两种方法都不管用

add_executable(myapp myapp.cpp)
target_link_libraries(myapp lib1 lib2 lib3 debug)
正如它抱怨的那样

“debug”参数后面必须跟一个库


在cmake中是否有解决此问题的方法?现在为了能够继续工作,我将libdebug.so复制到libdebug2.so,并针对debug2进行链接。但是我需要在cmake中找到一个长期解决方案,比如libdebug.so,它也被其他项目使用,我不能简单地更改它的名称。

在cmake中,您还可以通过它的全名指定库。当您要指定是使用静态库还是动态库时,这非常有用

在您的情况下,这是一种解决保留字“debug”的方法


但是,这种方法的一个缺点是,如果您也想在Windows中编译东西,就会遇到问题。然后,您需要通过将变量设置为.so或.lib文件来解决此问题。

另一种方法可能是为调试库创建导入的目标:

find_library(DEBUG_LIBRARY debug PATH <directory-contained-the-library> NO_DEFAULT_PATH)
add_library(debug_lib SHARED IMPORTED)
set_target_properties(debug_lib PROPERTIES IMPORTED_LOCATION ${DEBUG_LIBRARY})

虽然这种方法比使用完整的库名需要更多的行(和变量),但它与平台无关:CMake会自动选择搜索库的扩展。

您是否尝试过使用“libdebug.so”而不是“debug”?这似乎很有效。谢谢,我还没想到呢!啊哈,这是个好办法。谢谢是的,我也在考虑这种方法,但无法测试“debug”是否也是一个保留字。看到这一点,这无疑是更好的方法。我正试图用这种方法来解决另一个问题,我在制作时得到了“找不到-ldebug_lib”。它被编译为libdebug.so,但由于某些原因,该信息不会转换为Makefile。与普通库目标不同,导入在默认情况下具有本地可见性。为了能够在全局范围内使用此目标,您需要在创建导入的目标时指定其他全局关键字。非常好!我现在看到所有需要此库的目标都出现“无法生成安全运行时搜索路径”错误。所有的东西都建了,我能忽略这个吗?如果可能的话,我不想忽视。
find_library(DEBUG_LIBRARY debug PATH <directory-contained-the-library> NO_DEFAULT_PATH)
add_library(debug_lib SHARED IMPORTED)
set_target_properties(debug_lib PROPERTIES IMPORTED_LOCATION ${DEBUG_LIBRARY})
target_link_libraries(myapp lib1 lib2 lib3 debug_lib)