问题标签 [extern-c]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
703 浏览

c++ - 从 C++ 链接到 Fortran 库 (Lapack)

我在我的 C++ 代码中使用Lapack 。我很困惑如何正确链接到图书馆。这是一个小例子,对应于我从 Lapack 调用函数的代码:

如果我尝试使用 GCC 4.8.5 (Linux openSUSE) 编译它,我会收到以下错误:

我知道这是一个名称修改问题。如果我更改我的代码,在函数名称的末尾添加下划线,它可以使用 GCC 正确编译:

但它不能在 Windows 下使用 Intel 的编译器进行编译。在那里,修饰是不同的,我必须将其更改为lapack::ILAVER,然后编译。

我的代码必须在多个配置(Linux/Mac/Windows)下使用多个编译器(GCC、Intel、MSVC)进行编译。我怎样才能更通用,并确保它会在一大堆编译器下编译?

0 投票
1 回答
324 浏览

c++ - VS2013 C++ 编译器修改名称用 extern "C" 定义

我正在尝试构建一个使用来自 FTDI 的当前 2.12.28 ftd2xx.lib 静态库的 WIN32 控制台应用程序。我正在使用 VS2013 和本机非托管 C++。我的电话看起来像这样。

编译时出现链接错误

未解析的符号__imp__FT_CreateDeviceInfoList@4似乎是FT_CreateDeviceInfoList函数的名称错误版本。所以它没有在使用 C 命名的 ftd2xx.lib 中得到解决。我不明白的是为什么当 ftd2xx.h 文件有条件 extern "C" 时编译器会破坏名称

包装所有的FT_???声明。我已经确认 __cplusplus 是在编译期间定义的。任何想法是什么导致了意外的名称修改?

0 投票
1 回答
118 浏览

dll - 检查通过函数指针调用的函数是否有return语句

我们有一个插件系统,它通过 dlopening/LoadLibrarying dll/so/dylib 然后 dlsyming/GetProcAddressing 函数调用 dll(用户生成的插件)中的函数,然后将结果存储在函数指针中。

不幸的是,由于复制粘贴了一些错误的示例代码,这些 dll 中的一些没有正确的函数签名,并且不包含 return 语句。

一个 dll 可能包含以下内容:

或者它可能包含以下内容:

加载 dll 的应用程序依赖于返回值,但是有大量没有返回语句的 dll。我正在尝试检测这种情况,并警告用户他的插件存在问题。

这个天真的代码应该解释我想要做什么:

不幸的是,这不起作用,金丝雀在调用具有已知缺陷的 dll 后包含一个随机值。我天真地假设调用一个没有返回语句的函数会使金丝雀完好无损,但事实并非如此。

我的下一个想法是编写一点内联汇编程序来调用该函数,并在返回时检查 eax 寄存器,但 Visual Studio 2015 不再允许在 x64 代码中使用 __asm()。

我知道没有符合标准的解决方案,因为将函数指针转换为错误的类型当然是未定义的行为。但是,如果有人有一个至少可以在 64 位 Windows 上使用 Visual C++ 的解决方案,或者一个可以在 MacOS 上使用 clang 的解决方案,我会非常高兴。

0 投票
0 回答
50 浏览

c++ - 使用内置 c++ 类和模板从 C 调用 C++ 代码

所以我想使用string classand multiset templateofC++.

我的原始代码接口从Python使用Cctypes现在我正在尝试接口CC++. Python(如果&之间有任何直接接口C++,我会欢迎这个建议,但是通过几个 Stack Overflow 和 Stack Exchange 扫描,我发现这种方法更可行。@nm 在评论中提供了解决方案,但我仍然想要了解是否可以将 C 和 C++ 接口用于教育目的)

所以这里有一个简单的例子来重现当我尝试与字符串类合并时发生的事情......

以上是我的c文件。

上面是 cpp 文件。

如果我使用gccor编译g++,它不会编译,而是给出与字符串相关的链接器错误。

string 和 multiset 的解决方案是什么?

0 投票
2 回答
148 浏览

c++ - 无法从 C 调用 C++ 代码而不会出错

我正在尝试编写一个可以从 C 调用的 C++ 库。但是,每当我尝试编写一个最小的示例时,它都会因未定义的引用而崩溃。这是我的代码:


图书馆.h


图书馆.cpp


主程序


编译过程是这样的:

g++ -c mylibrary.cpp -o mylibrary.o(创建“mylibrary.o”)

ar rcs libmylibrary.a mylibrary.o(创建静态库“libmylibrary.a”)

gcc main.c -L. -lmylibrary(链接静态库并编译C源文件)

但是,我收到此错误转储:

有关如何解决错误的任何建议?

0 投票
2 回答
594 浏览

c++ - 外部“C”或不外部“C” [g++ vs cl]

我将数字食谱four1.c 与Nayuki 的FFT进行比较。两者都是 C 版本,但我使用的是 C++ 驱动程序。为了进行比较,我正在使用 CL.exe 和 g++ 将两者编译(或更恰当地说,链接)到可执行文件中。两人似乎在争论是否将 extern "C" 用于four1 函数,但似乎都不关心Nayuki 的。我为four1 制作了一个头文件,它检查_WIN32 以便适当地切换,它可以工作,但似乎是一个完全不可接受的hack。我将如何解决这个问题?

这是头文件:

这就是 CL 在没有外部“C”的情况下所做的:

这就是 g++ 在使用 extern "C" 时所做的:

对 CL 有效的对 g++ 无效,对 g++ 有效的对 CL 无效。至少对于这个文件。Nayuki 代码不存在这样的问题。

我尝试按照建议修改头文件,所以现在是 dfour1.h:

g++ 很好。CL 不是。

顺便说一句,如果没有头文件,也会发生同样的情况,我只需添加:

到 drvr.cpp 文件,并删除头文件。CL 仅在extern "C"存在时才有效,但 g++ 则无效。而删除extern "C"适用于 g++ 但不适用于 CL。

是的,我知道原始头文件是错误的,这就是问题的重点。当我“正确”地做到这一点时,它不起作用,因此是帖子。当我制作了一个“不正确”的头文件来检查正在使用的编译器时,它起作用了,这是令人讨厌的部分。简单地检查 c++ 是行不通的。

0 投票
2 回答
60 浏览

c++ - 将指向函数的指针作为参数传递给函数

只是想知道是否有人可以就我在这里出错的地方给我一些建议。如果我按原样运行我的程序可以正常工作,但是一旦我将注释行与它下面的行交换,我就会得到错误。我的目标是能够使用注释行,因为我想创建一个程序,让我将指向函数的指针作为参数传递给另一个函数,但到目前为止我没有运气。

我应该补充一点,我的最终目标是将函数 arith_op 和其他函数打包在一个单独的文件中,然后通过将它们的原型包含在“extern”中来使用它们。这可能是解决问题的一种奇怪的方法——它是为了分配,而且它们总是很奇怪。

谢谢 :)

韦德

0 投票
1 回答
369 浏览

c++ - 从通过 dlsym 执行的函数返回 unique_ptr

我有一个位于共享对象中的函数,并dlsym从主程序加载和执行。(共享对象和主程序都是C++)

这个函数有可能返回std::unique_ptr吗?

共享对象功能 -

主程序:

0 投票
1 回答
365 浏览

c++ - Visual Studio 2019 中的“C 链接函数无法返回 C++ 类”

我有以下功能:

但是,这不会使用 VS2019 编译(但是它使用 gcc)并带有警告

C 链接函数不能返回 C++ 类

但是,例如,当模板参数为双精度时,它确实有效……我可以返回一个“PyArray1D”,而 VS 不会抱怨。

所以我添加了一个新结构:

并从外部 C 函数返回它。

令我惊讶的是,这奏效了!我的问题是,为什么?

VS 还不够聪明,无法看到 FooArray get 是从模板函数中创建的吗?还有其他更简单的方法来解决这个问题吗?

0 投票
1 回答
245 浏览

c++ - 是否允许 extern extern "C" 和 extern "C" extern?

这段代码正确吗?

gcc 拒绝 1 和 2 作为语法错误并接受 3。clang 接受所有这三个但对它们都给出重复声明说明符警告。

也许相关的是 C++17 [dcl.stc]/5:

说明extern符只能应用于变量和函数的名称。说明extern符不能用于类成员或函数参数的声明。对于使用extern说明符声明的名称的链接,请参见 6.5。[注意:extern关键字也可以用在显式实例化链接规范中,但在这种情况下它不是存储类说明符。——尾注]