有没有办法在 Linux 上使用 GCC/Clang 强制多重定义的符号?
Is there a way to force multiply defined symbols using GCC/Clang on Linux?
我正在使用两个单独的库(PLCIO and azure-iot-sdk-c) on a project. This project is being developed primarily on Windows using Visual Studio, but needs to run on Linux in production. I'm currently using a Ubuntu box to simulate production. When compiling the program in Visual Studio on Windows I get the linker errors LNK2005 and LNK1169. I solved this problem by using the /FORCE:MULTIPLE linker 在 Visual Studio 中的选项。我们的应用程序按预期在 Windows 上编译和 运行s .
当我将代码和库移植到我的 Linux 测试箱时,我正在使用 cmake 来构建和 link 一切。该项目构建并 links 正确,但是当它 运行s 我遇到意外的分段错误。我通过一次使用一个库创建存根程序并确认它们按预期工作,将其缩小为两个库之间的交互。只有当我将两个库放在一起时,我 运行 才遇到问题。我认为这是一个公平的假设,即相同的多重定义符号错误导致了 Linux 上的这个段错误,只是由于某种原因在编译期间没有被捕获。
我已经尝试了一大堆编译和 linker 标志(使用 GCC 和 Clang)来构建这个项目来尝试解决这个问题。我试过 -fvisibility=hidden
-shared
-nostdlib
。我在 GCC documentation 中找到了 -symbolic
,但是当我尝试使用它时出现 "option not recognized" 错误。我最初是静态 linking 到预构建的库,但也尝试过动态 linking 和我自己用我的其余代码构建 azure-iot-sdk。我每次都得到相同的结果。
基本上我的问题归结为,对于 Linux 工具链(GCC、Clang,我不关心) 可以解决这个问题。或者,是否有一些替代解决方案是我在谷歌搜索和故障排除中以某种方式错过的?
我决定继续使用 运行 两个具有进程间通信的独立进程来解决这个问题。
虽然可能可以使用其他解决方案,例如 objcopy
,因为我不知道这些库中到底发生了什么,也没有时间熟悉 Microsoft 的所有源代码代码,似乎阻力最小的路径是使用两个进程。感谢您对此提供的一切帮助,希望该线程将来可以对某人有所帮助。
我正在使用两个单独的库(PLCIO and azure-iot-sdk-c) on a project. This project is being developed primarily on Windows using Visual Studio, but needs to run on Linux in production. I'm currently using a Ubuntu box to simulate production. When compiling the program in Visual Studio on Windows I get the linker errors LNK2005 and LNK1169. I solved this problem by using the /FORCE:MULTIPLE linker 在 Visual Studio 中的选项。我们的应用程序按预期在 Windows 上编译和 运行s .
当我将代码和库移植到我的 Linux 测试箱时,我正在使用 cmake 来构建和 link 一切。该项目构建并 links 正确,但是当它 运行s 我遇到意外的分段错误。我通过一次使用一个库创建存根程序并确认它们按预期工作,将其缩小为两个库之间的交互。只有当我将两个库放在一起时,我 运行 才遇到问题。我认为这是一个公平的假设,即相同的多重定义符号错误导致了 Linux 上的这个段错误,只是由于某种原因在编译期间没有被捕获。
我已经尝试了一大堆编译和 linker 标志(使用 GCC 和 Clang)来构建这个项目来尝试解决这个问题。我试过 -fvisibility=hidden
-shared
-nostdlib
。我在 GCC documentation 中找到了 -symbolic
,但是当我尝试使用它时出现 "option not recognized" 错误。我最初是静态 linking 到预构建的库,但也尝试过动态 linking 和我自己用我的其余代码构建 azure-iot-sdk。我每次都得到相同的结果。
基本上我的问题归结为,对于 Linux 工具链(GCC、Clang,我不关心) 可以解决这个问题。或者,是否有一些替代解决方案是我在谷歌搜索和故障排除中以某种方式错过的?
我决定继续使用 运行 两个具有进程间通信的独立进程来解决这个问题。
虽然可能可以使用其他解决方案,例如 objcopy
,因为我不知道这些库中到底发生了什么,也没有时间熟悉 Microsoft 的所有源代码代码,似乎阻力最小的路径是使用两个进程。感谢您对此提供的一切帮助,希望该线程将来可以对某人有所帮助。