code::blocks, как поставить параметр компоновщика `-lstdc++` в конце команды компилятора?

IDE — это code::blocks в Ubuntu 18.04. Рабочая область содержит два простых проекта. Первая представляет собой статическую библиотеку C++, в которой представлен только один файл cpp.

// try.cpp   -- The c++ static library is defined as:
# include <iostream>
extern "C"
{
    void shownum ( int n );
}

void shownum ( int n ){
    using namespace std;
    std::cout<<n<<endl;
}

журнал сборки:

-------------- Build: Debug in try (compiler: GNU GCC Compiler)---------------

g++ -Wall -fexceptions  -c /home/try/try.cpp -o obj/Debug/try.o
rm -f bin/Debug/libtry.a
ar -r -s bin/Debug/libtry.a obj/Debug/try.o
ar: creating bin/Debug/libtry.a
Output file is bin/Debug/libtry.a with size 2.78 KB
Process terminated with status 0 (0 minute(s), 1 second(s))
0 error(s), 0 warning(s) (0 minute(s), 1 second(s))

Файл libtry.a создан. Кажется, все в порядке. В другом проекте есть программа на фортране:

! main.f90  -- The main program by fortran is:
program main
    implicit none
    integer*4 y
    interface
      subroutine shownum(np) bind(C)
        use, intrinsic :: iso_c_binding
        implicit none
        integer (c_int), value :: np
      end subroutine shownum
    end interface
    y=5
    call shownum(y)
end

Библиотека c++ libtry.a связана с этим проектом fortran путем установки build options-->linker settings-->link libraries. При компиляции фортран проекта появляются ошибки:

-------------- Build: Debug in try2 (compiler: GNU Fortran Compiler)---------------

gfortran -Jobj/Debug/ -Wall  -g     -c /home/try2/main.f95 -o obj/Debug/main.o
gfortran  -o bin/Debug/try2 obj/Debug/main.o   ../try/bin/Debug/libtry.a
../try/bin/Debug/libtry.a(try.o): In function `shownum':
try.cpp:(.text+0x13): undefined reference to `std::cout'
try.cpp:(.text+0x18): undefined reference to `std::ostream::operator<<(int)'
try.cpp:(.text+0x22): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
try.cpp:(.text+0x2d): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
../try/bin/Debug/libtry.a(try.o): In function `__static_initialization_and_destruction_0(int, int)':
try.cpp:(.text+0x59): undefined reference to `std::ios_base::Init::Init()'
try.cpp:(.text+0x6e): undefined reference to `std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status
Process terminated with status 1 (0 minute(s), 1 second(s))
6 error(s), 0 warning(s) (0 minute(s), 1 second(s))

Теперь проблема более ясна. Это можно решить, изменив

gfortran  -o bin/Debug/try2 obj/Debug/main.o  -lstdc++  ../try/obj/Debug/try.o

to

gfortran  -o bin/Debug/try2 obj/Debug/main.o  ../try/obj/Debug/try.o -lstdc++ 

. Но я не знаю, как установить его в code::blocks. Я признателен, если кто-нибудь может предоставить какие-либо предложения.


person rocket    schedule 10.10.2019    source источник
comment
Вы связываете стандартную библиотеку С++ (которая реализует std::cout)?   -  person Jesper Juhl    schedule 10.10.2019
comment
@JesperJuhl Вы хотите связать стандартную библиотеку C++ с проектом fortran? Как это сделать? Я новичок в кодовых блоках. Спасибо   -  person rocket    schedule 10.10.2019
comment
Пожалуйста, добавьте любую дополнительную информацию, отредактировав исходное сообщение, чтобы оно было читабельным.   -  person Gem Taylor    schedule 10.10.2019


Ответы (1)


Решается установкой settings->compiler->other settings->advanced options, изменением порядка макроса командной строки. Затем в конец команды ставится опция компоновщика -lstdc++. Проблема исчезает.

person rocket    schedule 11.10.2019