我正在使用CMake为外部应用程序构建模块。作为构建的一部分,我还生成了一个可执行文件,它链接到模块以运行测试。但是,作为外部应用程序的模块约定的一部分,模块名不应该有lib
前缀。这将产生以下CMakeLists.txt
:
add_library(mymodule SHARED mymodule.c)
set_target_properties(mymodule PROPERTIES PREFIX "")
add_executable(mytest mytest.c)
target_link_libraries(mytest ${CMAKE_BINARY_DIR}/mymodule.so)
当构建时,CMake将路径转换为搜索名称,这导致错误:
/usr/bin/ld: cannot find -lmymodule
如果我在mymodule.so
构建后再次运行cmake .
(不改变任何东西),它从使用-lmymodule
切换到mymodule.so
的实际路径,并且它有效。如果我删除PROPERTIES PREFIX ""
,它也可以工作。
既然我在target_link_libraries()
中指定mymodule.so
路径,我怎么能让CMake停止将其转换为搜索名称(-lmymodule
)?
如果目标是项目的一部分,则应该链接目标,而不是文件。在您的情况下,它将是target_link_libraries(mytest mymodule)
。
但是如果由于某些原因需要链接到一个完整的路径,CMake有一些特性,在文档中有描述。因此,在您的情况下,它将完整路径转换为-lmymodule
,因为这是CMake显示的行为,如果提供给库的完整路径没有适当的名称。