- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有没有办法让我(没有 root 访问权限)使链接器(由 gcc
调用)不知道 /etc/ld.so.conf 中包含的目录的内容
在通过 ldconfig
缓存之后?
我正在尝试(但失败了)在没有 root 访问权限的自定义 linux 发行版上编译 HTCondor。由于各种原因(见下文),我认为我遇到的问题与 native 上安装了两个版本的 libssl 和两个版本的 libcrypto 有关。其中每一个的较新版本 (1.0.0) 位于 /usr/lib64
而旧版本 (0.9.8) 保留在 /usr/local/lib64
出于兼容性原因。 /etc/ld.so.conf
包含这两个路径,因此链接器知道这两个路径。
编译时出现错误
../condor_utils/libcondor_utils_8_7_9.so: undefined reference to `ERR_remove_thread_state'
由于某些原因,libcondor_utils_8_7_9.so
链接到 libcrypto.so.0.9.8
,而 ERR_remove_thread_state
是在 1.0 中引入的.0。它在源代码中只出现一次:
#if OPENSSL_VERSION_NUMBER < 0x10000000L
ERR_remove_state( 0 );
#elif OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
ERR_remove_thread_state( 0 );
#endif
所以预处理器似乎是根据版本 1.0.0 做出决定的。
This 问题让我注意到了 this 博客文章,所以我尝试用以下脚本替代 cpp
:
#!/bin/bash
/usr/bin/gcc -Wl,-rpath-link="/usr/lib64",-rpath="/usr/lib64" "$@"
不幸的是,没有用。
为了解决这个问题,我还尝试在上面的源代码片段中注释预处理器指令以强制选择 ERR_remove_state
。这导致链接器警告我 libssl.so.1.0.0
可能与 libssl.so.0.9.8
冲突,并且毫不奇怪地产生另一个“ undefined reference ”错误.
事实证明问题根本与链接器无关。看我的回答。但是,出于好奇,我会留下这个问题,看看是否有人在其原始公式中有解决方案。
最佳答案
@user463035818 和@jww 的评论为我指明了解决我的具体问题的正确方向,结果证明这与链接器没有直接关系。
Condor 使用 cmake 作为构建系统,因此显然尝试在 cmake 级别(此处为 n00b)解决此问题更有意义。在 cmake 做的所有事情的深处某处,它找到了两个版本的库并出于某种原因将它们混合在一起。根据 this 使用特定版本调用 find_library
主要的 CMakeLists.txt
中的答案解决了这个问题,尽管它在我嘴里留下了肮脏解决方法的坏味道。
根据 docs,让 cmake 在查找库时忽略某个目录应该不难.不过我还没有尝试过。
关于c++ - 使 ld 忽略/etc/ld.so.conf 中的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52818600/
我正在尝试创建尽可能小的 ELF。我创建了一个这样的测试文件(NASM 语法): SECTION .text dd 0xdeadbeef 使用此链接描述文件: SECTIONS { .text
GNU LD 链接器命令语言是否有条件语句? 背景:我正在为 arm cortex m0+ 开发固件,该固件由引导加载程序和应用程序组成。两者都在单独的项目中进行编译和刷新,但我使用了一个框架,其中包
我很确定 ld 有一个手册页链接器脚本语法,但我找不到它。 最佳答案 如果您更喜欢比 info 更方便的东西, 这是一个可浏览的 HTML 版本:ld.info: Scripts .但它可能不是完全最
谁能解决这个练习,这样我就能明白我错在哪里,因为有太多的 LOL 变量。 生成一个 C 代码,将其放在以下表达式之前 printf ("% ld% ld% ld \ n", lol, & lol, *
在他关于理解 Linux Kernel Initcall Mechanism 的文章中, Trevor 创建了一个用户空间程序来模拟调用 linux 驱动程序的 init_module() 的机制。
/usr/bin/ld: cannot find -ldlib /usr/bin/ld: cannot find -lcblas /usr/bin/ld: cannot find -llapack 在
我想以 json-ld 格式创建一组人,但我需要保留一些键而不是使用数组,所以我首先尝试了这个: { "@context" : { "@base" : "http://www.exampl
所以我试图围绕 JSON-LD 进行思考,我看到的所有示例主要包括嵌入“链接数据”。但我想提供对链接数据的引用(主要是因为嵌入所有数据可能会产生 10MB 的有效负载)。所以我想知道我这样做是否正确。
我在这里复制了 json-ld standard 中的示例的一部分: { "@context": { "foaf": "http://xmlns.com/foaf/0.1/", "
考虑这样一个程序: #include void foo() __attribute__((__weak__)); int main() { printf("%p\n", (void *)fo
我正在尝试使用一个名为 GLV 的小部件库对于我正在开发的应用程序。我正在运行 Linux Mint 17。我安装了所有库并成功构建了 GLV 库,但是当我尝试运行已构建的示例之一时,出现了此共享库错
在将未编辑的 JSON 数据转换为 JSON-LD 时,使用前缀和数据值为对象构造 IRI 时遇到问题。我运行的示例代码是: { "@context" : { "prefix" : "
假设我有一个 JSON 对象,它在嵌套对象中包含一些属性。 { "title": "My Blog Post", "meta": { "publishedAt": "2
我是 JSON-LD 和 LOD 的新手,所以请原谅我使用的术语。我正致力于在 JSON-LD 中创建数据模型,以描述基于欧洲数据模型 (http://pro.europeana.eu/edm-doc
我有一个玩具 x86 汇编程序,我正在用 as 编写和编译它和 ld : .text .global _start _start: movq $1, %rax movq
我正在尝试创建 Google 的结构化数据,但不知道我在做什么。我将其设置为一个组织,然后将 SD 标记工具用于我的所有产品。我将每个 JSON-LD 产品直接从标记工具而不是嵌套放入它自己的脚本标签
我正在尝试创建 Google 的结构化数据,但不知道我在做什么。我将其设置为一个组织,然后将 SD 标记工具用于我的所有产品。我将每个 JSON-LD 产品直接从标记工具而不是嵌套放入它自己的脚本标签
我正在尝试使用 vcpkg 和 ndk r20 为 android arm 构建 tesseract我必须编辑 CMakeLists.txt 并添加 glob.c 和 glob.h,因为它们不在 nd
长话短说: 有没有办法让我(没有 root 访问权限)使链接器(由 gcc 调用)不知道 /etc/ld.so.conf 中包含的目录的内容 在通过 ldconfig 缓存之后? 详细说明: 我正在尝
我想将/opt/vertica/lib64 添加到系统库路径中,所以我执行以下步骤: (1) 将/opt/vertica/lib64加入/etc/ld.so.conf,运行ldconfig, (2)
我是一名优秀的程序员,十分优秀!