Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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++;图书馆 我在C++中构建了一个代码,它使用C++库,它依赖C库,这是个奇怪的问题。我使用gcc编译了构成C库的C模块,并使用g++编译了所有其他源模块。C和C++库都是静态LIBS。 当我在C++源代码中从C库中包含头文件时,我将它封装在外部“C”: extern“C” { #包括 }_C++_C_Gnu - Fatal编程技术网

混合C和C++;图书馆 我在C++中构建了一个代码,它使用C++库,它依赖C库,这是个奇怪的问题。我使用gcc编译了构成C库的C模块,并使用g++编译了所有其他源模块。C和C++库都是静态LIBS。 当我在C++源代码中从C库中包含头文件时,我将它封装在外部“C”: extern“C” { #包括 }

混合C和C++;图书馆 我在C++中构建了一个代码,它使用C++库,它依赖C库,这是个奇怪的问题。我使用gcc编译了构成C库的C模块,并使用g++编译了所有其他源模块。C和C++库都是静态LIBS。 当我在C++源代码中从C库中包含头文件时,我将它封装在外部“C”: extern“C” { #包括 },c++,c,gnu,C++,C,Gnu,现在奇怪的是,链接时会出现“undefined reference”错误,但这些错误会根据我列出库的顺序而变化: 如果我首先列出C库,由C++模块引用的那个库中的所有符号都显示为“未定义”。 如果我先列出C++库,C++中引用的那个库中的所有符号都显示为“未定义”。 我本以为静态lib在g++命令行上的显示顺序与此完全无关。有人有线索吗?顺序很重要 如果libxxx依赖于libyyy,那么应该首先指定libxxx,即-lxxx-lyyy 不幸的是,当两者相互依赖时,一个库可能会被提到两次 -

现在奇怪的是,链接时会出现“undefined reference”错误,但这些错误会根据我列出库的顺序而变化:

  • 如果我首先列出C库,由C++模块引用的那个库中的所有符号都显示为“未定义”。
  • 如果我先列出C++库,C++中引用的那个库中的所有符号都显示为“未定义”。

我本以为静态lib在g++命令行上的显示顺序与此完全无关。有人有线索吗?

顺序很重要

如果libxxx依赖于libyyy,那么应该首先指定libxxx,即
-lxxx-lyyy

不幸的是,当两者相互依赖时,一个库可能会被提到两次

-lxxx -lyyy -lxxx
见:


不用多次列出库(如果有许多相互依赖的库,这可能会很麻烦),可以依靠GNU ld做正确的事情,来回搜索库列表,直到所有符号都被解析。这是使用
start\u group
/
end\u group
命令行开关实现的:

g++ <...flags...> -Wl,--start-group -lxxx -lyyy -Wl,--end-group <...other flags...>
g++-Wl,--start group-lxxx-lyyy-Wl,--end group
或者,如果档案的命名方式恰好是“不符合要求”,则直接提供:

g++-Wl,--start group xxx.a yyy.a-Wl,--end group

这种简洁功能的代价是降低链接速度,在许多情况下,这并不重要。

+1是一个很好的答案。不过,这让我大吃一惊。这一次,微软做得很好,因为它的链接器不需要我担心这些愚蠢的细节。我只是插嘴说,
-Wl,
位很重要,在gcc手册页中找到它后,我第一次尝试使用
--start-group
,但是如果你忘记了
-Wl,
它只是悄悄地跳过它,没有错误消息。无法理解为什么它不能按文档所述工作。有人知道为什么GNU ld不默认为多个过程吗?因为它在大链接上相当慢,在小链接上很少需要。但是,只有在第一个过程之后仍然存在未解析的符号时,才需要这样做,因此,它不会减缓任何没有它本可以工作的事情。好吧,你不是第一个对这个确切问题感到疑惑的人:)
g++ <...flags...> -Wl,--start-group -lxxx -lyyy -Wl,--end-group <...other flags...>
g++ <...flags...> -Wl,--start-group xxx.a yyy.a -Wl,--end-group <...other flags...>