- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
你好,
我对 c++/linux(ubuntu) 中的 .h 文件和 .cpp 文件有一些疑问。
可以使用 g++ 编译 .h 文件,还是可以只编译包含 .h 文件的 .cpp 文件?
从一个 .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
如果我说 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”条目,因此它会在原始位置找到库。
这一切都假定您希望将它用作常规库,在这种情况下您不想使用 dlopen。 dlopen
用于在运行时将库作为插件打开,并且只能通过使用 dlsym()
获取指向符号的指针来访问它们,但是如果您想正常访问库,您必须针对它进行链接,以便链接器可以解析符号。
如果您想使用dlopen
,您不得在test.cpp
中包含my_code.h
并且不得使用它定义的任何东西,除非使用dlsym
获取符号。由于这是 C++,它反过来要求您了解符号修改方案,因为 dlsym
不会为您做这件事。
关于C++ 未定义对 <a 函数> 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5933817/
我是一名优秀的程序员,十分优秀!