Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 创建共享库时,如何告知链接器可执行文件中有符号?_C_Macos_Linker_Ld_Undefined Symbol - Fatal编程技术网

C 创建共享库时,如何告知链接器可执行文件中有符号?

C 创建共享库时,如何告知链接器可执行文件中有符号?,c,macos,linker,ld,undefined-symbol,C,Macos,Linker,Ld,Undefined Symbol,我正在创建一个apache模块,它基本上是一个共享库(不是C语言,而是rust语言,所以我不能使用通常的apache工具来隐藏所有这些东西) 当我转到link时,ld告诉我有一堆未定义的符号。这些符号都在将加载此共享库的可执行文件中定义,即/usr/sbin/httpd。我用nm验证了这一点。我在任何其他静态或共享库中都找不到它们 如何告诉链接器符号在httpd中 下面是它正在触发的一个缩写链接器命令: "cc" "-m64" "-L" "/Users/me/.rustup/toolchains

我正在创建一个apache模块,它基本上是一个共享库(不是C语言,而是rust语言,所以我不能使用通常的apache工具来隐藏所有这些东西)

当我转到link时,
ld
告诉我有一堆未定义的符号。这些符号都在将加载此共享库的可执行文件中定义,即
/usr/sbin/httpd
。我用
nm
验证了这一点。我在任何其他静态或共享库中都找不到它们

如何告诉链接器符号在
httpd

下面是它正在触发的一个缩写链接器命令:

"cc" "-m64" "-L" "/Users/me/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib" "/Users/me/dev/apacheagent-myco/target/debug/deps/apacheagentmyco.apacheagentmyco0.rcgu.o" ...<tons of .o files>  "-Wl,-exported_symbols_list,/var/folders/6h/qx6jssj16q95_h_kqjd6qt_00000gn/T/rustc.xMMi8AxcVg62/list"  "-Wl,-dead_strip" "-nodefaultlibs" "-L" <tons of rlibs>  "-l" "onig" "-framework" "Security" "-framework" "CoreFoundation" "-l" "System" "-l" "resolv" "-l" "pthread" "-l" "c" "-l" "m" "-dynamiclib" "-Wl,-dylib" "-lapr-1" "-laprutil-1"
这些符号都在/usr/sbin/httpd中

如何告诉链接器符号在httpd中

您不需要这样做:默认情况下,UNIX链接器假定共享库将具有未解析的符号

您的问题似乎是:链接行上缺少
-shared
标志(没有该标志,链接器将尝试链接可执行文件,而不是要链接的共享库)


另外,使用
-nodefaultlibs
是不明智的。除非你知道自己在做什么,否则千万不要使用它。

仅供将来参考,以防其他人也有同样的问题,我告诉链接器忽略特定的符号来解决这个问题

... -Wl,-U,_ap_is_initial_req -Wl,-U,_ap_hook_handler -Wl,-U,_ap_server_root  

那么从共享库中,您在调用相同共享库的可执行文件中使用符号?不知道生锈,我仍然想知道链接命令是什么。它可能是给定给ld的对象的顺序。这是特定于平台和工具链的。不过,作为第一个猜测,请确保您将模块编译为共享库,而不是可执行文件。在许多(但不是所有)平台上,共享库允许有未定义的符号。@JohnBollinger mac不允许,但在阅读您的评论后,我四处查看,发现一个标志可以忽略特定符号,而不是全局允许未定义的符号:
-Wl,-U,\U symbol
。这就解决了,谢谢。我发现macos链接器在默认情况下并不完全遵循其他Unix的做法。添加
-未定义的动态\u查找
也似乎有效。
... -Wl,-U,_ap_is_initial_req -Wl,-U,_ap_hook_handler -Wl,-U,_ap_server_root