从 C++ 调用 C API 时缺少 printf 语句的输出
Calling C APIs from C++ missing output of printf statements
让我们通过示例代码。
ctest1.c
#include<stdio.h>
void ctest1(int *i)
{
printf("This is from ctest1\n"); // output of this is missing
*i=15;
return;
}
ctest2.c
#include<stdio.h>
void ctest2(int *i)
{
printf("This is from ctest2\n"); // output of this is missing
*i=100;
return;
}
ctest.h
void ctest1(int *);
void ctest2(int *);
现在让我们从中创建 c 库
gcc -Wall -c ctest1.c ctest2.c
ar -cvq libctest.a ctest1.o ctest2.o
现在让我们制作基于 cpp 的文件,它将使用这个 c api
prog.cpp
#include <iostream>
extern "C" {
#include"ctest.h"
}
using namespace std;
int main()
{
int x;
ctest1(&x);
std::cout << "Value is" << x;
ctest2(&x);
std::cout << "Value is" << x;
}
现在让我们用 C 库编译这个 c++ 程序
g++ prog.cpp libctest.a
现在像
一样运行它
./a.out
输出是:
值为5值为100
但这里的值是正确的。这意味着他们正确调用了c api。但是缺少这些 printf 语句的输出。
我错过了什么?
它很适合我(OSX 10.8,LLVM 6.0)。
您可能通过添加 printfs 修改了您的代码,而忘记相应地重新生成您的库。您应该使用 r
(替换选项)代替 q
。
但是混合两个 input/output 层时要小心,最好要求两者同步。调用 ios_base::sync_with_stdio(1) 让它们一起工作,参见 http://www.cplusplus.com/reference/ios/ios_base/sync_with_stdio/
让我们通过示例代码。
ctest1.c
#include<stdio.h>
void ctest1(int *i)
{
printf("This is from ctest1\n"); // output of this is missing
*i=15;
return;
}
ctest2.c
#include<stdio.h>
void ctest2(int *i)
{
printf("This is from ctest2\n"); // output of this is missing
*i=100;
return;
}
ctest.h
void ctest1(int *);
void ctest2(int *);
现在让我们从中创建 c 库
gcc -Wall -c ctest1.c ctest2.c
ar -cvq libctest.a ctest1.o ctest2.o
现在让我们制作基于 cpp 的文件,它将使用这个 c api prog.cpp
#include <iostream>
extern "C" {
#include"ctest.h"
}
using namespace std;
int main()
{
int x;
ctest1(&x);
std::cout << "Value is" << x;
ctest2(&x);
std::cout << "Value is" << x;
}
现在让我们用 C 库编译这个 c++ 程序
g++ prog.cpp libctest.a
现在像
一样运行它./a.out
输出是: 值为5值为100
但这里的值是正确的。这意味着他们正确调用了c api。但是缺少这些 printf 语句的输出。
我错过了什么?
它很适合我(OSX 10.8,LLVM 6.0)。
您可能通过添加 printfs 修改了您的代码,而忘记相应地重新生成您的库。您应该使用 r
(替换选项)代替 q
。
但是混合两个 input/output 层时要小心,最好要求两者同步。调用 ios_base::sync_with_stdio(1) 让它们一起工作,参见 http://www.cplusplus.com/reference/ios/ios_base/sync_with_stdio/