将可执行的 gcc 与可执行的 gcc 与可视化C++库链接是否安全
Is it safe to link a gcc excutable with a Visual C++ library?
将MinGW可执行与Visual C++编译的库链接起来有多安全。
类似于这里解释的内容。http://www.codesynthesis.com/~boris/blog/2011/12/09/oci-mingw/
TL;DR "...因为 OCI 是一个 C 库,我们可以采用 VC++ 的"官方"OCI 导入库,oci.lib
,将其重命名为 libclntsh.a
,我们有 MinGW 的 OCI。
这是一场等待发生的事故吗?可能出现什么问题?
这取决于。
AFAIK,没有什么可以阻止 glibc 和 msvcrt 在 Windows 上的同一进程中共存 - 在 Linux 上发生的相同全局函数搜索不会发生在 Windows 上(每个动态导入都知道它来自哪个 DLL - 函数不会合并到单个命名空间中(。
但是,特定库可能存在问题。例如,如果库指定"函数返回一个指针,完成后应该用free()
释放",你需要使用正确的 free 释放它,即对应于分配它的malloc()
的指针。同样,如果函数声明"参数是一个缓冲区,将由函数free()
释放",那么它必须与相应的malloc()
一起分配。类似的问题适用于可能使用realloc()
的地方。
例如,当使用针对不同版本的 MSVCRT 编译的 DLL 时,也会发生此问题,例如 MSVCRT20.dll 与 MSVCRT40.dll。
这就是为什么Windows库总是说明应该如何分配内存。 例如参见CoTaskMemAlloc/CoTaskMemFree,LocalAlloc/LocalFree,HeapAlloc/HeapFree。文档可能会指出"当不再需要缓冲时,必须使用 CoTaskMemFree 释放缓冲区"。或者他们可以提供自己的 free/alloc 对,例如"当不再需要时,必须用 SuperLibraryFreeBuffer 释放返回的缓冲区"(内部可以简单地委托给 CRT free
,但至少它将是正确的免费版本(。
这是因为 windows 一直是一个多语言平台,其中库可以用 C 以外的语言编写。今天,我们可能已经习惯了Lisp,Pascal等是C运行时之上的一层的想法 - 大多数程序员可能会认为即使它不像Pascal那样正确 - 但并不总是这样:在C被发明之前,Pascal在DEC计算机上普遍使用了两年, 众所周知,Windows遗产与DEC有很多共同之处。Windows的早期版本是用汇编程序编写的,并且...你知道的 Windows 3 标头中的"Pascal"调用约定是有原因的......
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 如何使字符串出现在编译的二进制可执行文件的开头?
- 程序在使用 system() 启动另一个可执行文件时停止
- 如何更改使用 CPack 安装的可执行文件的名称?
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 使用 CodeBlocks + GCC 构建的可执行文件是否可以在任何 Windows 上运行?
- GCC 8 交叉编译器输出 ARMv7 可执行文件而不是 ARMv6
- 对于相同的C 源文件,其GCC可执行文件在Windows中比Linux大的655倍.为什么这么大的差异
- 是否可以使用C++中的一个make命令,用两个不同的gcc版本编译两个不同可执行文件
- GCC 和 binutils build - C 编译器无法创建可执行文件
- 从 GCC 可执行文件中删除符号和 RTTI 文本
- 将可执行的 gcc 与可执行的 gcc 与可视化C++库链接是否安全
- GCC:检查编译为库还是可执行文件
- 在使用旧版本gcc / glibc / libstdc++的计算机上运行用gcc 4.7编译的c++ 11可执行文件的问
- 从源代码构建GCC 5.4;这样构建的可执行文件试图链接不兼容的libstdc++,但运行失败
- 如何获得GCC编译器在c/c++中运行的可执行文件名称
- GCC可以编译和运行源代码而不生成对象或可执行文件吗?
- 使用nvcc的可执行程序比使用gcc/g++和OpenCL的可执行文件大