编译第三方库提示typedef重复定义

我看不懂,但我真的好震撼。。。
引自:[轻笔记]多个第三方库typedef重定义冲突


问题描述
工程依赖opencv与课题组项目的一个库,编译时出现以下错误:
在这里插入图片描述

大概意思是,两个库里都用typedef定义了int64,发生冲突。

无解之下请教了课题组的c++小王子——建哥。不一会,建哥发我一个链接:Typedef redefinition (C2371) for uint32 in two 3rd-party libraries。问题本质是一样的。

所以,照猫画虎,在冲突的库头文件前后分别加下如下内容,问题就解决了。
在这里插入图片描述
在这里插入图片描述

编译通过!

### Linux 下编译带有依赖关系的动态库 #### 定义与概念 在Linux环境中,动态库是一种共享对象文件,在运行时被加载到内存中供多个进程使用。当一个动态库A依赖于另一个动态库B时,则需确保这些依赖项能够正确解析并加载。 为了创建具有外部依赖性的动态库,通常遵循以下流程: 1. **准备源码** - 确保所有必要的源代码已经准备好,并且项目结构清晰合理。 2. **配置构建环境** 当涉及到跨平台或特定架构下的开发时,可以利用`./configure`脚本来定制化编译选项[^3]。对于需要静态链接的情况,可以通过设置`LDFLAGS="-static"`来指示编译工具链采用静态方式处理目标二进制文件及其所依赖的资源[^4]。 3. **编写Makefile 或 CMakeLists.txt 文件** 这些文件定义了项目的编译规则以及各个模块之间的关联性。特别是针对动态库而言,应该指明其所需的其他库的位置和版本号等信息。 4. **编译过程中的注意事项** 对于存在相互依赖关系的一组动态库来说,在编译过程中需要注意几点事项: - 如果某些第三方库并非位于标准路径下,则可能还需要通过 `-I` 参数指定额外的头文件搜索目录,以及通过 `-L` 参数提供相应的库文件所在路径; 5. **解决动态链接器找不到自定义路径的问题** 若遇到类似错误提示:“动态链接器(ld-linux.so.2)未找到指定的动态库路径”,则意味着当前系统的默认搜索范围未能覆盖新生成的动态库所在的文件夹。此时可采取如下措施之一加以修正[^2]: - 修改 `/etc/ld.so.conf.d/*` 中的相关条目并将更改同步至全局缓存(`sudo ldconfig`); - 设置 `LD_LIBRARY_PATH` 环境变量临时增加新的库路径; - 在应用程序启动前调用 `export LD_PRELOAD=/path/to/libcustom.so` 来强制预载入所需组件; 6. **验证最终产物的功能完整性** 使用命令如 `ldd ./your_dynamic_library.so` 查看是否存在任何缺失的符号引用或其他潜在问题。如果一切正常的话,那么就意味着成功地完成了整个编译工作流。 7. **示例:C++ 动态库编译** ```cpp // hello.cpp #include <iostream> extern "C" void say_hello() { std::cout << "Hello from dynamic library!" << std::endl; } ``` ```bash g++ -fPIC -c hello.cpp -o hello.o g++ -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 hello.o ln -s libhello.so.1.0 libhello.so.1 ln -s libhello.so.1.0 libhello.so ``` 8. **测试已编译好的动态库** 假设有一个简单的测试程序 test.c 如下所示: ```c // test.c #include <dlfcn.h> int main(){ void *handle = dlopen("./libhello.so", RTLD_LAZY); if (!handle){ fprintf(stderr,"%s\n", dlerror()); exit(EXIT_FAILURE); } typedef void (*func_t)(); func_t fptr=(func_t)dlsym(handle,"say_hello"); if(fptr!=NULL)fptr(); dlclose(handle); return 0; } ``` 编译此测试程序并与之前创建的动态库一起执行: ```bash gcc -rdynamic -o test test.c -ldl ./test ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值