【发布时间】:2020-09-17 21:17:06
【问题描述】:
我正在努力将开源工具移植到 Solaris。大多数事情都有效,cmake/pkg-config/等。在那里,找到了依赖关系,gmake 工作,编译器和链接器调用看起来都很好,并且很流行:
Undefined first referenced
symbol in file
std::qsort(void*, unsigned int, unsigned int, int (*)(const void*, const void*)) ...
这部分我不明白。乍一看,std::qsort 没有意义,它应该是 C 库的一部分,而不是 STL。所以我查看了 stdlib.h 并找到了一个列表,如 using std::sort; 和许多其他标准函数,如 free、malloc、atoi 等,在 C++ 上下文的情况下重定向。
Oracle 在那里做什么?为什么?如果他们像这样重定向它,我应该链接哪个库?或者为什么 CC 命令不像 GCC 那样自动将其拉入? 我尝试添加 -lstdc++ 但没有运气。
另外,普通的 libc 版本似乎在
编辑:
由于对构建系统的怪异有多种怀疑,这里基本上是来自 gmake 执行的链接调用:
/opt/developerstudio12.6/bin/CC -std=c++11 -xO3 -DNDEBUG <i.e. bunch of object files> -o ../systest -L/opt/csw/lib/64 -lintl
我在那里看不到任何特别之处,我希望 CC 弄清楚要链接什么以获得强制性功能。
【问题讨论】:
-
真正的问题是:你到底是如何构建这个的,以便标准库默认不链接到二进制文件?那是我不明白的部分,除非 cmake 在 Solaris 上被简单地破坏了。链接器应自动将您的应用程序与 C 和 C++ 运行时库链接。如果没有,那有些东西很时髦。您所说的重定向很有趣,但在这里并不重要-它们已被纳入标准(嗯,重定向不是,只是相关符号的存在,谁会两次实现这样的对-没人,因为这很愚蠢- 因此重定向)。
-
不,真正的问题是:谁负责流程中的关键部分?让我分解一下:a)C++ 编译器,b)调用用户,如果(b)那么 b1)从手册页中获取 lib 名称?或b2)从其他地方找到它?或 b3) cmake/autoconf 应该弄清楚吗?或b4)cmake / autoconf的用户检查代码应该弄清楚吗?关于意义:Sun/Oracle 似乎在 C 运行时和 C++ 运行时两次实现了代码。这部分没有意义。除非用户能够在没有 libc 的情况下链接 cpp 应用程序,否则只能链接 cpp 运行时。
-
@UnslanderMonica 发布的编译器命令将生成 32 位二进制文件。但
-L选项表示正在搜索64 位 库。必须解决这个问题,因为我们不知道/opt/csw/lib/64中的内容,所以我们不知道哪些库无法加载。