C语言unresolved external symbol ?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言unresolved external symbol ?相关的知识,希望对你有一定的参考价值。

我写了四个源文件,连接的时候出错,到底怎么运行呢。
我把代码写在下面,第一个
#include<stdio.h>
void main()

extern void enter_string(char str[]);
extern void delete_string(char str[], char ch);
extern void print_string(char str[]);

char c;
char str[80];
enter_string(str);
scanf(str,c);
delete_string(str,c);
print_string(str);

第二个
#include<stdio.h>
#include<string.h>
void enter_string(char str[80])

gets(str);

第三个
#include<stdio.h>
void delete_string(char str[],char ch)

int i,j;
for(i=j=0;str[i]!='\0';i++)
if(str[i]!=ch)
str[j++]=str[i];
str[j]='\0';

第四个
#include<stdio.h>
void print_string(char str[])

printf("%s\n",str);

运行的时候我是运行第一个文件,编译的时候没问题,连接就出错了,麻烦高手详细解答
出错如下
Linking...
file1.obj : error LNK2001: unresolved external symbol _print_string
file1.obj : error LNK2001: unresolved external symbol _delete_string
file1.obj : error LNK2001: unresolved external symbol _enter_string
Debug/file1.exe : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.
我用的是VC6.0++的,我说了不要放在一个文件里面,我就是为了掌握多文件的运行方法,麻烦三楼的朋友说说为什么要在每一个文件里面加上#include"stdafx.h"这个东西呢,我试了还是不行,不知道怎么回事

没有问题,我复制进VS2005里面,但要在每个文件前面加上
#include"stdafx.h"再改一下你main函数中的错误就能运行了,但没有遇到你这里提示的错误
首先,你的main函数里
scanf(str,c);//这句是什么意思?看不明白,
因此我改为下面这样,程序正确运行。
scanf("%c",&c);

VS2005必须加上include"stdafx.h"这个才能运行,其他版本不清楚。

解释下:我把你的程序分别复制到4个.cpp文件里的,只要把main函数里的scanf改一下就正确的,请问你是把程序写在同一个工程里面不同的.cpp文件中的吗?要写在cpp文件中才正确的
参考技术A 这是连接错,这个_save_ts
肯定是声明了,
如果_save_ts
是一个函数的话,可能是你没有把.c或者.cpp文件加入工程,
如果是一个全局变量,可能是你没有在.c或者.cpp文件中定义这个变量.
参考技术B 将其他文件作为头文件包含在一个文件里面。
例如
#include "1.cpp"
#include "2.cpp"
...
不是让你把它们作为一个文件
参考技术C 这四个文件要添加到同一个工程中 参考技术D scanf("%c",&c);改一下scanf就行了

swig -c++ 选项破坏纯 C 文件的包装,错误 C3861:unresolved externals

【中文标题】swig -c++ 选项破坏纯 C 文件的包装,错误 C3861:unresolved externals【英文标题】:swig -c++ option breaks wrapper of pure C files with error C3861:unresolved externals 【发布时间】:2022-01-13 19:35:36 【问题描述】:

我正在尝试包装给定的 C API,以便可以使用 SWIG 在 Python 中使用它。该 API 需要从 Python 向其传递回调函数(Python 将 Python 函数传递给 C,该函数从 C 调用并在 Python 中执行)。这可以使用 C++ 和导向器 - %module(directors="1") 来实现。但是,当我将 -c++ 选项添加到 swig 设置文件时,它无法在链接阶段找到任何 C 函数。在我添加 -c++ 选项之前,它编译得很好并且可以在 Python 中运行,减少所需的回调。

我已经创建了一个非常简单的这种形式的示例演示代码:

add.c:

#include <stdio.h>
int add_func(int x, int y) 
    return x+y;

添加.h:

int add_func(int x, int y);

添加.i:

%module add
%
    #include "add.h"
%
%include "add.h"

setup.py:

from setuptools import setup, Extension

setup(
    name='add',
    py_modules=['add'],
    ext_modules=[
        Extension('_add',
                  sources=['add.c', 'add.i'],
                  swig_opts=['-c++']
        )
    ]
)

编译命令:

python3 setup.py build_ext --inplace

使用swig_ops=['-c++'] 我收到以下错误:

add_wrap.obj : error LNK2001: unresolved external symbol "int __cdecl add_func(int,int)" (?add_func@@YAHHH@Z)
build\lib.win32-3.8\_add.cp38-win32.pyd : fatal error LNK1120: 1 unresolved externals
error: command 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\BuildTools\\VC\\Tools\\MSVC\\14.16.27023\\bin\\HostX86\\x86\\link.exe' failed with exit status 1120

删除swig_ops=['-c++'] 后编译正常。

所以问题是你可以在 C++ 和 swig 中使用纯 C 代码吗?如果有怎么办?

系统信息:

SWIG Version 4.0.2
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:43:08) [MSC v.1926 > 32 bit (Intel)] on win32 exe

【问题讨论】:

【参考方案1】:

生成的包装器是 C++,但 add.c 编译为 C 并具有 C 链接。错误消息表明它正在寻找带有 C++ 链接的add_func

要么将extern "C" 添加到add.h 原型,以便add_wrap.cxx 将查找C 函数,要么将add.c 重命名为add.cpp,以便编译为C++。

使 C 头文件同时兼容 C 和 C++ 的典型方法是:

#ifdef __cplusplus
extern "C" 
#endif

int add_func(int x, int y);

#ifdef __cplusplus

#endif

如果您有无法更改的 C 标头,另一种选择是将其包含在 .i 文件中的 extern "C" 中,以便生成的 add_wrap.cxx 将 C 链接用于外部函数:

%module add
%
    extern "C" 
        #include "add.h"
    
%
%include "add.h"

【讨论】:

以上是关于C语言unresolved external symbol ?的主要内容,如果未能解决你的问题,请参考以下文章

c语言编写时出现error LNK2001: unresolved external symbol _start

C 语言 error LNK2001: unresolved external symbol _fprint

unresolved external symbol的解决方法

swig -c++ 选项破坏纯 C 文件的包装,错误 C3861:unresolved externals

VS2010 Unresolved External Symbol boost::asio::detail::winsock_init_base::throw_on_error 将 boost-sys

C++ Unresolved External Symbols Embedded Lua(基于 longjmp 问题)(不重复)