gpt4 book ai didi

C++ 未定义对 的引用

转载 作者:IT王子 更新时间:2023-10-29 00:37:06 26 4
gpt4 key购买 nike

你好,

我对 c++/linux(ubuntu) 中的 .h 文件和 .cpp 文件有一些疑问。

  1. 可以使用 g++ 编译 .h 文件,还是可以只编译包含 .h 文件的 .cpp 文件?

  2. 从一个 .h 文件和它的 .cpp 文件(.cpp,其中我包含一些代码到我在 .h 文件中定义的方法)我使用以下命令创建一个 .so 文件:

    g++-fPIC -shared my_code.cpp -o my_code.so`

    test.cpp 中,我包含了 .h 文件并使用 dlopen 在 .so 文件上创建了一个处理程序。为什么会出现以下错误:

    undefined reference to bool `Class::method(std::string)` `collect2: ld returned 1 exit status
  3. 如果我说 virtual bool method... 在 .h 文件中编译 test.cpp 时没有错误。有人可以解释我做错了什么吗?问题是我有一个模板。使用模板我不能使用虚拟..所以..我有这个未定义的错误,我不知道如何解决它。谢谢

编辑:

当我编译 my_code.cpp 时出现错误:

/usr/bin/ld: .usr/lib/debug/usr/lib/crt1.o relocation 0 has invalid symbol index 12 (same with index 13,2,14...22 ).

但是当我创建 .so 文件时没有错误。我使用:

g++ test.coo -ldl -o test

用于test.cpp编译。

最佳答案

广告 1:可以编译 .h 文件(您可以显式覆盖语言检测),但您不想这样做。 .h 文件旨在包含在内,不会自行编译成任何有用的东西。

广告 2:您必须通过传递 -lmy_code链接到您创建的库(但请注意,要使其正常工作,您必须将其创建为 libmy_code.so) 以及适当的 -L 标志(放置 libmy_code.so 的目录)到链接器。像这样:

g++ test.cpp -L. -lmy_code -ldl -o test

但是您还必须将第一个命令更改为:

g++ -fPIC -shared my_code.cpp -o libmy_code.so
^^^
libraries *must* have `lib` prefix on unix systems.

这假设两者都在同一个目录中完成——如果不是,您必须调整 -L 选项以指向 libmy_code.so 所在的目录。您还必须将 libmy_code.so 放在动态链接器可以找到它的地方。通过安装它或将环境变量 LD_LIBRARY_PATH 设置到适当的目录。或者,您可以使用

进行编译
g++ test.cpp my_code.so -ldl -o test

这不会强制使用 lib 前缀,它会在二进制文件中创建一个“rpath”条目,因此它会在原始位置找到库。

这一切都假定您希望将它用作常规库,在这种情况下您不想使用 dlopendlopen 用于在运行时将库作为插件打开,并且只能通过使用 dlsym() 获取指向符号的指针来访问它们,但是如果您想正常访问库,您必须针对它进行链接,以便链接器可以解析符号。

如果您想使用dlopen,您不得test.cpp中包含my_code.h并且不得使用它定义的任何东西,除非使用dlsym 获取符号。由于这是 C++,它反过来要求您了解符号修改方案,因为 dlsym 不会为您做这件事。

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