gpt4 book ai didi

c++ - 如何将应用程序与静态库链接+为什么这不起作用

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:48 24 4
gpt4 key购买 nike

我有一个问题。我写了示例代码,我想在没有错误的情况下构建它:

main.cpp(.text+0x5): undefined reference to `test()'

图书馆


测试1.c

#include <stdlib.h>
void test()
{
puts("Działa");
}

测试1.h

#ifndef TEST1_H
#define TEST1_H

extern void test();

#endif

生成文件

all:
gcc -c ./src/test1.c -o ./lib/test1.o
ar rcs ./lib/libtest1.a ./lib/test1.o

程序


主要.cpp

#include <test1.h>

int main()
{
test();
return 0;
}

生成文件

all:
g++ -static -I../test1/include -L../test1/lib ./src/main.cpp -o ./build/MyApp -ltest1

我做错了什么?

最佳答案

您正在编译一个 C 代码函数,但您希望链接一个 C++ 函数。

由于“类型安全链接”,您提供的函数不是 C++ 代码调用的函数。

要么在 test1.h 中使用:

#ifdef __cplusplus
extern "C" {
#endif

extern void test1(void);

#ifdef __cplusplus
}
#endif

或者:

  • 使用 C++ 编译器编译函数。

C++ 编译器将破坏符号名称以提供类型安全的链接(您应该能够通过首选搜索引擎搜索的术语)。

“编译器”——实际上是链接器——正在寻找一个具有 C++ 损坏名称的函数,该名称代表带有签名“void test1(void);”的 C++ 函数。

例如(但请记住——不同的编译器故意以不同的方式处理事情),MacOS X 10.6.2 上的 G++ 4.2.1 为该函数生成一个符号“__Z5test1v”; GCC 生成符号“_test1”。显然,当链接器正在寻找“__Z5test1v”时,不会使用符号“_test1”——它的拼写不同。这是好事。

您可以在主程序的目标文件上使用“nm -g”来查看它正在寻找什么,并在库中的目标文件上使用它来查看它正在提供什么。并且,考虑到拼写不同,这就是为什么加载程序不选择库函数的原因 - 它正在寻找具有不同名称的东西。

关于c++ - 如何将应用程序与静态库链接+为什么这不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2539164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com