我正在使用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
,因為如果提供給庫的完整路徑沒有正確的soname,那么這是一種行為。