当前位置: 首页 > 面试题库 >

强制CMake使用完整的库路径

古弘
2023-03-14
问题内容

我有以下问题。我的Linux机器上有一棵单独的{bin,lib,include}树,安装了我的开发工作所需的CMake和所有库。但是只有PATH环境变量被设置到该bin目录,由于某些原因,我无法设置LD_LIBRARY_PATH。该树中的所有程序都是使用RPATH构建的。我正在使用的CMake3.3.1也在此树中。

现在,我想使用libcurl编译程序并设置以下CMakeLists.txt的问题

PROJECT(EXAMPLE)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) 
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
FIND_PACKAGE(CURL REQUIRED)
FIND_PACKAGE(OpenSSL REQUIRED) 
INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR})
SET(LIBS ${CURL_LIBRARIES} ${OPENSSL_LIBRARIES})

ADD_EXECUTABLE(curl_ex src/curl_ex.c)
TARGET_LINK_LIBRARIES(curl_ex ${LIBS})

现在,当我运行CMake时,由于它位于与CMake相同的前缀之内,因此在我的个人软件树中发现了curl和OpenSSL设置。

但是当我使用构建项目时,会make VERBOSE=1看到以下链接命令:

gcc CMakeFiles/curl_ex.dir/src/curl_ex.c.o  -o curl_ex -rdynamic -lcurl -lssl -lcrypto

而build可执行文件是指在系统范围内安装的curl和openssl库,而不是在配置过程中发现的一个cmake。

在执行链接时,如何强制CMake使用找到的库?


问题答案:

把我的评论变成答案

即使没有完全相同的环境,我也能够重现您的问题,并找到了两种可能的解决方案

  1. 您将政策设置CMP0060NEW
    cmake_policy(SET CMP0060 NEW)
    

此策略的新行为是按完整路径链接库,即使它们位于隐式链接目录中也是如此。

  1. 您可以创建一个中间导入的库并使用IMPORTED_LOCATION(请参阅[CMake] TARGET_LINK_LIBRARIES和完整路径库)
    add_library(curl UNKNOWN IMPORTED)
    

    set_property(TARGET curl PROPERTY IMPORTED_LOCATION “${CURL_LIBRARIES}”)
    target_link_libraries(curl_ex curl)

这对我有用,但是根据CMake导入的库行为,您可能还需要设置IMPORTED_IMPLIB

背景

请检查的设置,CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES因为此处列出的路径被视为“隐式”搜索路径,并且完整的库路径也已相应替换(请参见cmComputeLinkInformation::CheckImplicitDirItem()UnixPaths.cmake)。

message("CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES: ${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES}")


 类似资料:
  • 我正在尝试生成完整的路径列表,而不是优化的。使用下面的示例可以更好地解释。 上面代码创建了一个带有边的图和和 我想要的只是从中提取所有路径。 我试过: 我想要的只是: 是否有任何来自的预先存在的方法可以使用?如果没有,有什么方法可以编写一个最优的方法来完成这项工作? 注意:我的问题仅限于给出的例子。再也不可能有拐角案件了。 注2:为简化起见,生成数据。在我的例子中,edges列表来自数据集。假设给

  • 简介 Apache ShardingSphere 使用 ThreadLocal 管理分片键值进行强制路由。 可以通过编程的方式向 HintManager 中添加分片值,该分片值仅在当前线程内生效。 Hint 的主要使用场景: 分片字段不存在 SQL 和数据库表结构中,而存在于外部业务逻辑。 强制在主库进行某些数据操作。 使用方法 使用 Hint 分片 规则配置 Hint 分片算法需要用户实现 or

  • 问题内容: 我正在尝试创建完整路径(如果不存在)。 代码如下: 只要只有一个子目录(例如“ dir1”之类的newDest),此代码就可以很好地工作,但是当存在一个目录路径(“ dir1 / dir2”)时,它将失败并显示 错误:ENOENT,没有这样的文件或目录 我希望能够用最少的代码行来创建完整路径。 我读到fs上有一个递归选项,并像这样尝试过 我觉得递归地创建一个不存在的目录应该很简单。我是

  • 我有和表,我在laravel中建立了一对一的关系,这很好,但如果我尝试在不引用任何用户(id)的情况下手动将数据(外键用户id)添加到电话表中,它也会起作用。 在mysql(phpmyadmin)中,迁移后没有建立外键关系。 所以我想问,外键的优势是什么,如果它不把任何约束放在数据库表中,或者如果有任何方法可以使用laravel添加这些约束,请告诉我。 代码片段 app/Phone.php app

  • 我得到以下错误: 错误:任务“:ui:进程执行失败”演示机器人测试手册“。java.lang.Runtime异常: 清单合并失败 : uses-sdk:minSdk 版本 1 不能小于在库中声明的版本 7 [com.android.support:回收视图-v7:23.3.0] E:\DHIS2_IN\Android\dhis2-android-new-sdk\ui\build\中间体\分解-aa

  • 我试图使用完整文件路径列表(大多数是唯一的)(例如“C:\Folder1\file\u 1.xls”)复制到完整文件夹路径(例如“C:\DifferentFolder”)。 完整文件路径和完整文件夹路径都因行而异。我已经成功地使用COPY完成了这一点,将所有路径都放在引号中。 继续使用此功能的问题是,我发现,在查看之前和之后的#个文件时,我只有大约95%的成功率。bat文件已完成。我不确定问题是什