【问题标题】:g++ linking issueg ++链接问题
【发布时间】:2010-02-27 11:51:11
【问题描述】:

我有一个使用 g++ (GCC v4.4 MinGW) 编译的依赖库 (libfcgi),使用以下调用:

g++ -Iinclude -c -O2 *.c
ar rcs ../libfcgi.a *.o

现在,我的主要项目是这样构建的:

g++ -Idependancies\libfcgi\include -Ldependancies -O2 -lfcgi *.cpp

g++ 显然找到了 libfcgi.a,但它无法链接到以下参考:

'FCGI_printf'
'FCGI_Accept'

在 libfcgi 源码中,这些函数定义如下:

#ifdef __cplusplus
extern "C" {
#endif
//...
DLLAPI int FCGI_printf(const char *format, ...);  
DLLAPI int FCGI_Accept(void);
//...
#ifdef __cplusplus
}
#endif

DLLAPI 什么都不是(因为它没有编译为共享库)并且定义了 __cplusplus (g++)。

查看 libfcgi.a,这些函数导出为“_FCGI_Accept”和“_FCGI_printf”,因此前面带有下划线。这似乎是阻碍 g++ 找到它们的原因。

我认为使用 export "C" 就足以链接到 C++ 中的 C 函数,那么我做错了什么?

谢谢:)

【问题讨论】:

    标签: c++ c linker g++


    【解决方案1】:

    如果您的 .cpp 源代码中有相同的 extern "C" 定义,那么我认为您的问题是 -lfcgi 应该在命令行中跟随 *.cpp:

    g++ -Idependancies\libfcgi\include -Ldependancies -O2 *.cpp -lfcgi
    

    【讨论】:

    • 你真的认为在这种情况下参数顺序很重要吗?
    • 是的,确实如此。库对象文件仅包含在前面的对象文件中,其中包含对符号的引用。
    • 哈!信不信由你,但结合 edgar.holleis 的回答,它确实有效!谢谢!
    【解决方案2】:

    在您的主项目中,您告诉编译器链接 C 函数,因为 extern "C"。因此,它需要未损坏的符号名称。因此,您应该使用 C 编译器而不是 C++ 编译器编译 fcgi 库。

    【讨论】:

    • 好的,我试过用gcc编译libfcgi,但问题仍然存在:(
    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多