- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试交叉编译 TranscriberAG使用 MXE,我遇到了一个我不明白的问题。
我设法在一个小文件上重现了这个问题:
#include <dlfcn.h>
int test() {
dlopen("test", RTLD_LAZY);
}
我编译它:
/path/to/mxe/usr/bin/i686-pc-mingw32.static-g++ -o test_dl.obj -c test_dl.cpp
/path/to/mxe/usr/bin/i686-pc-mingw32.static-ar cr test_dl.a test_dl.obj
/path/to/mxe/usr/bin/i686-pc-mingw32.static-g++ -shared -o test_dl.dll -Wl,--whole-archive test_dl.a -Wl,--no-whole-archive -ldl -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
(当然,这些命令都是CMake生成的,我不能随便改)。它失败了:
test_dl.a(test_dl.obj):test_dl.cpp:(.text+0x16): undefined reference to `_dlopen(char const*, int)'
collect2: error: ld returned 1 exit status
我已经在 mxe 中安装了 dlfcn。如果我用我的本地 (Debian/Sid) 编译器尝试类似的命令:
g++ -o test_dl.obj -c test_dl.cpp -fPIC
ar cr test_dl.a test_dl.obj
g++ -shared -o test_dl.dll -Wl,--whole-archive test_dl.a -Wl,--no-whole-archive -ldl
效果很好...
这是 objdump 的输出:
$ /home/eroux/softs/mxe/usr/i686-pc-mingw32/bin/objdump -t /home/eroux/softs/mxe/usr/i686-pc-mingw32.static/lib/libdl.a
In archive /home/eroux/softs/mxe/usr/i686-pc-mingw32.static/lib/libdl.a:
dlfcn.o: file format pe-i386
SYMBOL TABLE:
[ 0](sec -2)(fl 0x00)(ty 0)(scl 103) (nx 1) 0x00000000 dlfcn.c
File
[ 2](sec 1)(fl 0x00)(ty 20)(scl 3) (nx 1) 0x00000000 _save_err_str
AUX tagndx 0 ttlsiz 0x0 lnnos 0 next 0
[ 4](sec 3)(fl 0x00)(ty 0)(scl 3) (nx 0) 0x00000040 _error_buffer
[ 5](sec 3)(fl 0x00)(ty 0)(scl 3) (nx 0) 0x00000000 _current_error
[ 6](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000190 _dlopen
[ 7](sec 3)(fl 0x00)(ty 0)(scl 3) (nx 0) 0x00010040 _first_object
[ 8](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000300 _dlclose
[ 9](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x000003a0 _dlsym
[ 10](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000460 _dlerror
[ 11](sec 1)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .text
AUX scnlen 0x470 nreloc 42 nlnno 0
[ 13](sec 2)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .data
AUX scnlen 0x0 nreloc 0 nlnno 0
[ 15](sec 3)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .bss
AUX scnlen 0x1004c nreloc 0 nlnno 0
[ 17](sec 4)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .rdata
AUX scnlen 0xb nreloc 0 nlnno 0
[ 19](sec 6)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .rdata$zzz
AUX scnlen 0x11 nreloc 0 nlnno 0
[ 21](sec 7)(fl 0x00)(ty 0)(scl 3) (nx 1) 0x00000000 .eh_frame
AUX scnlen 0x17c nreloc 5 nlnno 0
[ 23](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _GetLastError@0
[ 24](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _FormatMessageA@28
[ 25](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _SetErrorMode@4
[ 26](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _LoadLibraryExA@12
[ 27](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _malloc
[ 28](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _GetModuleHandleA@4
[ 29](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _sprintf
[ 30](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _FreeLibrary@4
[ 31](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _free
[ 32](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _GetProcAddress@8
[ 33](sec 0)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00000000 _CloseHandle@4
我一定是遗漏了一些明显的东西......它是什么?
编辑:如果我将 -v
添加到第三个 g++ 命令,我得到:
Using built-in specs.
COLLECT_GCC=/home/eroux/softs/mxe/usr/bin/i686-pc-mingw32.static-g++
COLLECT_LTO_WRAPPER=/home/eroux/softs/mxe/usr/libexec/gcc/i686-pc-mingw32.static/4.9.1/lto-wrapper
Target: i686-pc-mingw32.static
Configured with: /home/eroux/softs/mxe/tmp-gcc-i686-pc-mingw32.static/gcc-4.9.1/configure --target=i686-pc-mingw32.static --build=x86_64-unknown-linux-gnu --prefix=/home/eroux/softs/mxe/usr --libdir=/home/eroux/softs/mxe/usr/lib --enable-languages=c,c++,objc,fortran --enable-version-specific-runtime-libs --with-gcc --with-gnu-ld --with-gnu-as --disable-nls --disable-shared --disable-multilib --without-x [...]
Thread model: win32
gcc version 4.9.1 (GCC)
COMPILER_PATH=/home/eroux/softs/mxe/usr/libexec/gcc/i686-pc-mingw32.static/4.9.1/:/home/eroux/softs/mxe/usr/libexec/gcc/i686-pc-mingw32.static/4.9.1/:/home/eroux/softs/mxe/usr/libexec/gcc/i686-pc-mingw32.static/:/home/eroux/softs/mxe/usr/lib/gcc/i686-pc-mingw32.static/4.9.1/:/home/eroux/softs/mxe/usr/lib/gcc/i686-pc-mingw32.static/:/home/eroux/softs/mxe/usr/lib/gcc/i686-pc-mingw32.static/4.9.1/../../../../i686-pc-mingw32.static/bin/
LIBRARY_PATH=/home/eroux/softs/mxe/usr/lib/gcc/i686-pc-mingw32.static/4.9.1/:/home/eroux/softs/mxe/usr/lib/gcc/i686-pc-mingw32.static/4.9.1/../../../../i686-pc-mingw32.static/lib/
COLLECT_GCC_OPTIONS='-v' '-shared' '-o' 'test_dl.dll' '-mtune=generic' '-march=pentiumpro'
/home/eroux/softs/mxe/usr/libexec/gcc/i686-pc-mingw32.static/4.9.1/collect2 -plugin /home/eroux/softs/mxe/usr/libexec/gcc/i686-pc-mingw32.static/4.9.1/liblto_plugin.so -plugin-opt=/home/eroux/softs/mxe/usr/libexec/gcc/i686-pc-mingw32.static/4.9.1/lto-wrapper -plugin-opt=-fresolution=/tmp/cc3LyEtG.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt --shared -Bdynamic -e _DllMainCRTStartup@12 --enable-auto-image-base -o test_dl.dll /home/eroux/softs/mxe/usr/lib/gcc/i686-pc-mingw32.static/4.9.1/../../../../i686-pc-mingw32.static/lib/dllcrt2.o /home/eroux/softs/mxe/usr/lib/gcc/i686-pc-mingw32.static/4.9.1/crtbegin.o -L/home/eroux/softs/mxe/usr/lib/gcc/i686-pc-mingw32.static/4.9.1 -L/home/eroux/softs/mxe/usr/lib/gcc/i686-pc-mingw32.static/4.9.1/../../../../i686-pc-mingw32.static/lib --whole-archive test_dl.a --no-whole-archive -ldl -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 -lstdc++ -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lmoldname -lmingwex -lmsvcrt /home/eroux/softs/mxe/usr/lib/gcc/i686-pc-mingw32.static/4.9.1/crtend.o
test_dl.a(test_dl.obj):test_dl.cpp:(.text+0x16): undefined reference to `dlopen(char const*, int)'
collect2: error: ld returned 1 exit status
这似乎表明好的libdl被占用了,对吧?
编辑: 在命令前添加 LD_LIBRARY_PATH=''
不会改变任何东西...
最佳答案
看起来 dlfcn.h
header 没有包含在 extern "C"
block 中的函数原型(prototype),因此无法使用 C++ 正确编译。
确保您使用的 dlfcn-win32
库是最新的(extern "C"
包装器已添加到 dlfcn.h
一月份)。
关于c++ - C mxe 链接失败 : ld cannot find symbols,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25333527/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!