cmake mingw игнорирует -Wl, - g c -секций - PullRequest
0 голосов
/ 25 марта 2020

У меня проблема с этим кодом на C ++:

void f();
void g()
{
    f();
}

f () не определена в любом месте проекта, а g () нигде не вызывается. Я использую следующие директивы cmake:

add_compile_options(-fdata-sections -ffunction-sections)
add_link_options(-Wl,--gc-sections)

Используя mingw32, компоновщик жалуется, что f () отсутствует, но это не то, чего я ожидаю, так как g () не должна быть связана в первую очередь. Используя g cc на linux, проект связывается правильно. Я подозреваю, что mingw 1st создает промежуточную библиотеку. Это подробный вывод

C:\msys64\mingw32\bin\g++.exe -g  -Wl,--gc-sections -Wl,--whole-archive CMakeFiles\main.dir/objects.a -Wl,--no-whole-archive  -o main.exe -Wl,--out-implib,libmain.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles\main.dir\linklibs.rsp
CMakeFiles\main.dir/objects.a(main.cpp.obj): In function `Z1gv':
C:/Users/Documents/Sandbox/testcmake/main.cpp:20: undefined reference to `f()'
collect2.exe: error: ld returned 1 exit status

--- EDIT ---

Я могу повторить проблему с помощью этого простого теста:

main. cpp:

void f();

void g(){
        f();
}

int main(){
        return 0;
}

Затем скомпилируйте с:

gcc -o main main.cpp -fdata-sections -ffunction-sections -Wl,--gc-sections

В mingw32: неопределенная ссылка на `f () '

В linux: OK

...