仅限Cmake命令行参数-使用链接外部库

我是一个新的Cmake和学习。我正在使用Ubuntu20

我不允许更改CMakeLists.txt文件。我试图使用-DIMPORTED_LOCATION=/home/map/third_party链接外部库(libdlt.so),它位于用户定义的位置而不是默认位置。但是通过这个命令,我得到了以下错误

/usr/bin/ld:找不到-ldlt
collect2:错误:ld返回了1个退出状态

请您帮助澄清为什么不选择此参数?如果此库(libdlt.so)位于默认位置(/etc/local/lib),则CMake工作正常

谢谢
&lt

不能仅使用命令行参数执行此操作

导入的位置是目标属性。这意味着它仅在应用于CMake目标时对CMake有意义

CMake中的依赖项通常使用导入的目标进行管理,该目标具有imported\u LOCATION属性

这将是这样做的:

查找路径(DLT\u包括目录DLT/DLT.h)
查找库(DLT\U库名称DLT)
添加库(dlt::dlt导入)
设置\u目标\u属性(dlt::dlt属性
导入的位置${DLT\U库}
接口_INCLUDE_目录${DLT_INCLUDE_目录}
)
#然后,在以后的CMake脚本中。。。
目标链接库(可执行公共dlt::dlt)

首先找到路径。包括目录和库路径

然后,创建导入的目标并将路径设置为其属性

然后使用正确的前缀路径调用CMake,以便find.*命令在正确的目录中搜索:

cmake-DCMAKE\u PREFIX\u PATH=/home/map/third\u party

现在,正如您在评论中提到的,您不能更改CMakeLists文件

如果您使用的库中有这个损坏的CMake脚本,我建议您将其分叉,并修复它们的CMake文件,使其不被硬编码

如果坚持不修改CMake文件,那么可以做几件事

您可以创建自己的CMakeLists.txt,然后改用它。是的,你能做到!这是一种黑客行为,但允许您使用可修改的CMakeLists.txt来修复其行为

为不可修改的项目创建同级目录,并在其中添加CMakeLists.txtbuild/目录

在这些CMake中,使用如下相对路径:

添加库(yourlib静态)
目标源(yourlib../yourproject/file1.cpp../yourproject/file2.cpp)

然后,使用适当的find_XXX函数,以便CMake有机会找到正确的库,而不是硬编码的路径


还有另一个黑客,但有点黑客

您可以使用带有命令行参数的自定义程序替换CMake使用的链接程序:

cmake-DCMAKE_LINKER=/path/to/LINKER-DCMAKE_CXX_LINK_EXECUTABLE=&quot&书信电报;CMAKE_LINKER&gt&书信电报;旗帜&gt&书信电报;CMAKE_CXX_LINK_标志&gt&书信电报;链接标志&gt&书信电报;对象&gt-o<目标&gt&书信电报;链接库&gt&引用;

您可以使用脚本替换/path/to/linker,该脚本将用正确的标记替换硬编码的标记

这是一个非常刻薄的问题。预计事情会破裂或表现不正常


如果你不能创建一个单独的CMakeLists脚本,替换link程序也不是一个选项,那么你可以做另一个hack。这是令人难以置信的黑客,难以创建,难以维护,初学者不友好的解决方案,而且非常脆弱,很容易损坏

我必须警告您,这比向第三方库应用修补程序糟糕得多,比创建自己的CMake脚本糟糕得多。我不会把它推荐给任何人。它还处理CMake中最糟糕的部分

您可以使用cmd和CMake\u PROJECT\u INCLUDE在脚本中插入CMake文件:

cmake-DCMAKE_PROJECT_INCLUDE=myfile.cmake

myfile.cmake中,可以编写cmake代码

此时,可以使用宏修补CMake builtin命令,以捕获不需要的行为,并将其替换为需要的行为

宏(链接库)
#在ARGV中查找并替换
endmacro()


如果您无法编写CMake文件来替换CMake命令,我将假定您的文件系统是不可变的,并且您的错误无法修复;)

发表评论