【问题标题】:Unresolved externals and extern "C"?未解决的外部和外部“C”?
【发布时间】:2013-08-11 18:33:18
【问题描述】:

尽管我对 C++ 很陌生,但我并不完全理解这种链接之类的东西。 我认为这是关于extern "C" 链接。

extern "C"
{
int loadbmp(char *filename, unsigned char **buf,
            int *w, int *h, int pf, int bottomup);
const char *bmpgeterr(void);
}

unsigned char *srcBuf=NULL, **jpegBuf=NULL;
unsigned long jpegsize=0;
int width, height;
char *filename={"Screenshot158139.bmp"};
tjhandle handle=NULL;

void main(){
    if(loadbmp(filename, &srcBuf, &width, &height,TJPF_RGB, 0)==-1){
        //printf("Could not load bitmap: %s\n", bmpgeterr());
        exit(1);
    }
    if((handle=tjInitCompress())==NULL) {
        printf("Could not initialize compressor: %s\n", tjGetErrorStr());
        free(srcBuf);
        exit(1);
    }
    if((tjCompress2(handle, srcBuf, width, 0, height, TJPF_RGB,
                    jpegBuf, &jpegsize, TJSAMP_444,10, 0))==-1) {
        printf("Could not compress: %s\n", tjGetErrorStr());
        free(&srcBuf);
        tjDestroy(handle);
        exit(1);
    }    
}

我从中得到的问题是我需要解决我认为的extern "C" 代码:

error LNK2001: unresolved external symbol loadbmp

遗憾的是,我不知道该怎么做,而且由于此错误在 C++ 世界中极为常见,因此找到答案并不容易,因为它们可能会有所不同。

希望解决这个问题很容易,因为我想我必须将它定义为外部代码。

【问题讨论】:

  • 如果我没记错的话,来自 C++ 标准的第 7 节。
  • main() 的唯一可移植返回类型是 int
  • 只是一般提示:文字字符串是常量,因此您应该将指向文字字符串的变量声明为const char* filename = "..."; 或像char filename[] = "..."; 中的数组.
  • 至于您的问题,您在构建时缺少与文件链接,无论是库文件还是目标文件。
  • @user2587718 - 所有 c/c++ 程序需要链接。

标签: c++ c extern-c


【解决方案1】:

您似乎已经声明了loadbmp(),但您还没有定义它。函数在哪里定义?如果它应该来自一个库,不要自己声明这个函数,而是包含相关的头文件。该函数的文档应该告诉您哪个是相关的标头,并且应该提到您可能需要包含哪些额外的库。

如果loadbmp() 不是您想从库中获取的函数,您需要定义(实现)它。

【讨论】:

  • 我来自库或标题(Turbojpeg),遗憾的是,我不知道如何导入它。我已经添加了所有的库,但是这个特殊的东西(loadbmp)不存在,但我可以在源文件中看到它,这就是我尝试自己添加它的原因。
  • 好吧,这仍然是问题的答案,剩下的由我来找到这些东西。谢谢
  • 简单地寻找那些东西,似乎有一个名为libjpeg-turbo 的开源库提供了一个像你声明的那样的签名。您是否安装了这个库并将其适当地包含在您的构建中?
  • 如果这是来自一个库,你不能进一步声明它,你只需要调用它并包含适合编译的头文件和链接的.lib文件
  • 我已经包含了 libjpeg-turbo 库和头文件,其他所有内容似乎都被检测到了,但我认为 loadbmp 是一些特殊情况,会询问作者更多信息。
【解决方案2】:

您缺少的是链接到您的.lib 文件。通常一种快速简便的方法是将此行添加到文件的顶部

#pragma comment(lib,"put_your_lib_filename_here.lib")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多