gpt4 book ai didi

c++ - 混合使用 C 和 C++ 的库/链接器问题

转载 作者:太空宇宙 更新时间:2023-11-04 00:46:51 25 4
gpt4 key购买 nike

我一直在为通用应用程序编写一些 C 和 C++ 基础结构。目前这是一项正在进行的工作,包括使用 Lua 进行配置解析、日志记录功能和使用我自己的网络协议(protocol)/消息传递 API 的客户端/服务器 API。

我已将代码组织成两个库:一个用于 C 代码 (libmarlin.so),一个用于 C++ 代码 (libmarlin++.so)。我有两个而不是一个的原因是顺便说一句,我仍然只遇到 C++ 库的原始问题:将应用程序链接到它会导致 Lua 代码或我的 C 库中的代码加上一些“ undefined reference ”错误其他随机 C++“operator new”引用,具体取决于 Makefile 中 -l 开关的顺序。我找不到满足依赖关系的组合。我已经了解这些开关的排序的重要性,并已尝试根据本网站上的问题提出建议;一切都无济于事。

我会在这里粘贴我认为相关的内容,以节省复制大量代码的时间。如果您需要其他任何东西,请询问或克隆我的 GitHub 存储库:https://github.com/adamd1008/marlin .您需要存储库外部名为 lua-5.3.2 的文件夹中的 Lua 代码,或者根据需要更改 Makefile。另请注意,我修改了 Lua makefile 以构建动态库而不是默认的静态库,因此我在构建时使用了 -llua。 (这实际上只是为了尝试解决根本问题。)

编译:

make -C src
make[1]: Entering directory `/home/adam/marlin/src'
** Compiling file 'log.c'
gcc -std=c99 -g -c -Wall -Wextra -Werror -rdynamic -fPIC -I../../lua-5.3.2/src -DMAJOR_VER=1 -DMINOR_VER=0 -DBUILD_VER=0 -DLOG_UUID=\"27dc17c4-bd53-11e5-bb37-a02bb831a7e4\" log.c -o log.o
** Compiling file 'msg.c'
gcc -std=c99 -g -c -Wall -Wextra -Werror -rdynamic -fPIC -I../../lua-5.3.2/src -DMAJOR_VER=1 -DMINOR_VER=0 -DBUILD_VER=0 -DLOG_UUID=\"27dc17c4-bd53-11e5-bb37-a02bb831a7e4\" msg.c -o msg.o
** Linking file 'libmarlin.so.1.0.0'
gcc -shared -Wl,-soname,libmarlin.so.1.0.0 -o ../lib/libmarlin.so.1.0.0 log.o msg.o
ln -sf libmarlin.so.1.0.0 ../lib/libmarlin.so
** Compiling file 'M_App.cpp'
g++ -std=c++11 -g -c -Wall -Wextra -Werror -rdynamic -fPIC -pedantic -I../../lua-5.3.2/src -DMAJOR_VER=1 -DMINOR_VER=0 -DBUILD_VER=0 M_App.cpp -o M_App.o
** Compiling file 'M_Field.cpp'
g++ -std=c++11 -g -c -Wall -Wextra -Werror -rdynamic -fPIC -pedantic -I../../lua-5.3.2/src -DMAJOR_VER=1 -DMINOR_VER=0 -DBUILD_VER=0 M_Field.cpp -o M_Field.o
** Compiling file 'M_FieldMap.cpp'
g++ -std=c++11 -g -c -Wall -Wextra -Werror -rdynamic -fPIC -pedantic -I../../lua-5.3.2/src -DMAJOR_VER=1 -DMINOR_VER=0 -DBUILD_VER=0 M_FieldMap.cpp -o M_FieldMap.o
** Compiling file 'M_Msg.cpp'
g++ -std=c++11 -g -c -Wall -Wextra -Werror -rdynamic -fPIC -pedantic -I../../lua-5.3.2/src -DMAJOR_VER=1 -DMINOR_VER=0 -DBUILD_VER=0 M_Msg.cpp -o M_Msg.o
** Compiling file 'M_MsgApp.cpp'
g++ -std=c++11 -g -c -Wall -Wextra -Werror -rdynamic -fPIC -pedantic -I../../lua-5.3.2/src -DMAJOR_VER=1 -DMINOR_VER=0 -DBUILD_VER=0 M_MsgApp.cpp -o M_MsgApp.o
** Linking file 'libmarlin++.so.1.0.0'
gcc -shared -L../../lua-5.3.2/src -llua -Wl,-soname,libmarlin++.so.1.0.0 -o ../lib/libmarlin++.so.1.0.0 M_App.o M_Field.o M_FieldMap.o M_Msg.o M_MsgApp.o
ln -sf libmarlin++.so.1.0.0 ../lib/libmarlin++.so
make -C test
make[2]: Entering directory `/home/adam/marlin/src/test'
** Compiling file 'msg_test.c'
gcc -std=c99 -g -c -Wall -Wextra -Werror -rdynamic -I../../../lua-5.3.2/src msg_test.c -o msg_test.o
** Linking file 'msg_test.o'
gcc -L../../lib -L../../../lua-5.3.2/src -lm -ldl -llua -lmarlin -o msg_test msg_test.o
** Compiling file 'app_test.cpp'
g++ -std=c++11 -g -c -Wall -Wextra -Werror -rdynamic -pedantic -I../../../lua-5.3.2/src app_test.cpp -o app_test.o
** Linking file 'app_test.o'
g++ -L../../lib -L../../../lua-5.3.2/src -lm -ldl -llua -lmarlin -lmarlin++ -o app_test app_test.o
../../lib/libmarlin++.so: undefined reference to `lua_tolstring(lua_State*, int, unsigned long*)'
../../lib/libmarlin++.so: undefined reference to `lua_type(lua_State*, int)'
../../lib/libmarlin++.so: undefined reference to `luaL_loadfilex(lua_State*, char const*, char const*)'
../../lib/libmarlin++.so: undefined reference to `lua_getglobal(lua_State*, char const*)'
../../lib/libmarlin++.so: undefined reference to `lua_geti(lua_State*, int, long long)'
../../lib/libmarlin++.so: undefined reference to `luaL_openlibs(lua_State*)'
../../lib/libmarlin++.so: undefined reference to `lua_typename(lua_State*, int)'
../../lib/libmarlin++.so: undefined reference to `lua_settop(lua_State*, int)'
../../lib/libmarlin++.so: undefined reference to `lua_close(lua_State*)'
../../lib/libmarlin++.so: undefined reference to `lua_pushstring(lua_State*, char const*)'
../../lib/libmarlin++.so: undefined reference to `lua_gettable(lua_State*, int)'
../../lib/libmarlin++.so: undefined reference to `luaL_newstate()'
collect2: error: ld returned 1 exit status
make[2]: *** [app_test] Error 1
make[2]: Leaving directory `/home/adam/marlin/src/test'
make[1]: *** [test] Error 2
make[1]: Leaving directory `/home/adam/marlin/src'
make: *** [all] Error 2

我怀疑有一个简单的解释,但我无法解决。根据最后的编译步骤, -llua 是在我的两个库之前指定的,但是 libmarlin++.so 仍然有问题,即使它本身也链接到 Lua 库(虽然我不确定在构建动态库时有什么影响?)。

如有任何指点,我们将不胜感激。

最佳答案

您的 Github 存储库中有很多代码,因此彻底分析需要时间,但乍一看,这似乎是“extern "C" 丢失的案例”(双关语)。

在 C++ 代码中,当包含 C header 时,您需要 extern "C"。有几种方法可以做到这一点。首先,当包含时,例如:

extern "C" {
#include "the_c_header.h"
}

其次,在 header 本身中:

#if defined(__cplusplus)
extern "C" {
#endif

.... contents of the C header...

#if defined(__cplusplus)
}
#endif

第三个是费时说明,基本上,在C头文件中的任何声明中添加extern "C"

可能还有其他问题,但我会先尝试这个。

关于c++ - 混合使用 C 和 C++ 的库/链接器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34842914/

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