未定义的引用添加到现有文件和标头

时间:2013-01-06 12:27:29

标签: c mingw header-files undefined-reference

首先我知道这被问了一千次。但我打开了一些,每个人都忘了编译/链接它。 无论如何,我在带有标题和文件的单独文件中创建了一个链接列表,它工作正常,但是我尝试向它添加一个新函数,但后来我对'function'进行了未定义的引用。这是来源:

list.c

#include "list.h"

struct node
{
    item_t x;
    struct node *next;    
};
struct node* root;

//Window hider extension
void ToggleVisibleList(HWND currentHwnd)
{
    if (root == 0)
        return;

    struct node *conductor = root;
    while (conductor != 0)
    {
        HWND hwnd = (HWND)conductor->x;
        ShowWindow(hwnd, IsWindowVisible(hwnd) ? SW_HIDE : SW_SHOW);

        conductor = conductor->next;
    }    

    ShowWindow(currentHwnd, IsWindowVisible(currentHwnd) ? SW_HIDE : SW_SHOW);
}

//...Rest of the file

list.h

#ifndef LIST_H
#define LIST_H

#include <stdlib.h>
#include <windows.h>

//Window hider extension
void ToggleVisibleList(HWND currentHwnd);

//.. rest of the header

的main.c

#include <windows.h>
#include <stdio.h>
#include <commctrl.h>

#include "list.h"

HWND currentHwnd;

//..

HHOOK hookKeyboard;
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode >= 0)
    {
        if (wParam == WM_KEYDOWN)
        {
            KBDLLHOOKSTRUCT* hookStruct = (KBDLLHOOKSTRUCT*)lParam;
            if (hookStruct->vkCode == 'Z' && GetAsyncKeyState(VK_LCONTROL))
            {
                ToggleVisibleList(currentHwnd);
            }
        }
    }

    CallNextHookEx(hookKeyboard, nCode, wParam, lParam);
}

//..Rest of file

我使用Mingw编译(操作系统:Windows 8 64位):

gcc -o hider.exe main.c list.c -mwindows

C:\Users\...\AppData\Local\Temp\cc6sCa17.o:main.c:(.text+0x4bc): undefined reference to `ToggleVisibleList'
collect2: ld gaf exit-status 1 terug
//Translation: ld return exit-status 1

编辑:尝试交换文件顺序。

我希望我没有重复一个问题,我不这么认为,因为我先尝试了20个问题。 (还有谷歌。) 此致

答案:重新启动计算机并进行编译。

1 个答案:

答案 0 :(得分:0)

黑暗答案中的总镜头:

我怀疑可能有效(在编译顺序中交换list.c和main.c)

gcc -o hider.exe list.c main.c -mwindows

我建议这样做,因为与库的链接与gcc具有相似的行为。但我从未在文件顺序中发现过这个问题。

来自gcc手册页(关于 -l library

  

在您编写此选项的命令中,它会有所不同;该   链接器搜索和进程              库和目标文件按指定顺序排列。因此,foo.o -lz bar.o搜索库              z在文件foo.o之后但在bar.o之前如果bar.o引用z中的函数,则这些函数可能不是              加载。