__iob_func упоминается в функции _gsl_error при использовании библиотеки GSL

Используя библиотеку GSL 2.4 в Visual Studio 2017 и получая эти ошибки при компиляции и запуске,

Severity    Code    Description Project File    Line    Suppression State
Error   LNK2019 unresolved external symbol ___iob_func referenced in function _gsl_error    
ImplementerGSL  C:\Users\MyUserName\source\repos\ImplementerGSL\ImplementerGSL\gsl.lib(error.obj)   1   

Severity    Code    Description Project File    Line    Suppression State
Error   LNK2001 unresolved external symbol ___iob_func  ImplementerGSL  
C:\Users\MyUserName\source\repos\ImplementerGSL\ImplementerGSL\gsl.lib(stream.obj)  1   
Severity    Code    Description Project File    Line    Suppression State

Error   LNK2019 unresolved external symbol _fprintf referenced in function _gsl_error   ImplementerGSL  
C:\Users\MyUserName\source\repos\ImplementerGSL\ImplementerGSL\gsl.lib(error.obj)   1   

Severity    Code    Description Project File    Line    Suppression State
Error   LNK2001 unresolved external symbol _fprintf ImplementerGSL          
C:\Users\iTzEinstein118Xx\source\repos\ImplementerGSL\ImplementerGSL\gsl.lib(stream.obj)    1

Более подробная информация о машине и проекте;

  • Последнее обновление Visual Studios 2017 для Fall Creators Update
  • Кодирование на C (не C++)
  • GSL — это научная библиотека GNU, не путать с GSL.Microsoft.
  • Последняя версия библиотеки GSL, установленная в C:/gsl. Известно, что он совместим с VS2017.
  • Свойства решения были отредактированы, чтобы указать на библиотеки GSL. Дополнительные * включают каталоги: C:\gsl\include Дополнительные каталоги библиотек: C:\gsl\lib Дополнительные зависимости: gsl.lib;cblas.lib Определения препроцессора: _GSL_DLL

Моя цель в конечном итоге - использовать библиотеку для другого проекта. Однако я не могу заставить этот простой тестовый код работать. Код написан на C, в VS2017 установлены библиотеки C++ и так далее. Исходные файлы были переименованы в .c, а не в .cpp.

Мой код:

#include "stdafx.h"
#include <stdlib.h>
#include <gsl/gsl_sf_bessel.h>


int main()
{
    double x, y;
    x = 5.0;
    y = gsl_sf_bessel_zero_J0(x);
    printf("J0(%g) = %.18e\n", x, y);
    return 0;
}

а затем мой заголовочный файл stdafx,

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>

Сейчас я провел немало исследований и не могу найти ничего, чтобы решить эту проблему конкретно. Извините, если это дублирующийся ответ, но если есть другой вопрос, который решает эту проблему, я хотел бы узнать об этом! Спасибо за любую помощь заранее. Пс. Новичок в C, но знаком с C#.

РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ *: добавлена ​​устаревшая библиотека, но это по-прежнему оставляет неразрешенный внешний символ __iob_func (первые две ошибки).


person theQuantumMechanic    schedule 17.03.2018    source источник
comment
Связано?   -  person user58697    schedule 17.03.2018
comment
@user58697 user58697 Спасибо за указатель, добавил ссылку на устаревшие библиотеки, и это решает половину проблемы, но оставляет мне __iob_func как неразрешенный символ.   -  person theQuantumMechanic    schedule 17.03.2018
comment
Если ваши библиотеки были созданы с помощью предыдущей версии Visual Studio, вам может потребоваться их перестроить.   -  person Dmitri Chubarov    schedule 17.03.2018
comment
Вы говорите, что ваши бинарные файлы библиотеки GSL VS2017 установлены под C:\GSL, но ваше сообщение об ошибке указывает, что ваша сборка использует двоичные файлы GSL, установленные под C:\Users\MyUserName\source\repos\ImplementerGSL. Вероятно, последние были построены с помощью VS2015.   -  person Dmitri Chubarov    schedule 17.03.2018
comment
@DmitriChubarov Библиотеки GSL фактически установлены на верхнем уровне диска C, каталог ошибок указывает на мой исходный код, реализующий его.   -  person theQuantumMechanic    schedule 17.03.2018
comment
@DmitriChubarov также, не будучи знакомым с C, возможно, это другое. Но чтобы перекомпилировать для нового VS, мне нужен исходный код, как я и думал. В моей библиотеке есть только файлы заголовков и различные библиотеки. Как мне это сделать?   -  person theQuantumMechanic    schedule 17.03.2018
comment
Извините, я, вероятно, неправильно истолковал это C:\Users\iTzEinstein118Xx\source\repos\ImplementerGSL\ImplementerGSL\gsl.lib как указание на то, что gsl.lib находится в вашем локальном каталоге. (это саркастическое замечание)   -  person Dmitri Chubarov    schedule 17.03.2018
comment
@DmitriChubarov, насколько я понимаю, это локальная ссылка на мой исходный код. Я могу ошибаться. Однако я совершенно ясно вижу, что библиотека tee установлена ​​на верхнем уровне моего диска C.   -  person theQuantumMechanic    schedule 17.03.2018
comment
@AlbertFerguson Моя гипотеза состоит в том, что у вас установлены две версии библиотеки (одна на верхнем уровне, а другая в пользовательском каталоге), и они скомпилированы с разными версиями системных библиотек.   -  person Dmitri Chubarov    schedule 17.03.2018


Ответы (1)


Итак, после долгих поисков и возни я нашел обходной путь.

Установив пакет Nuget локально, как и на верхнем уровне диска C. Это означает просто настройку всех входных данных компоновщика и тому подобное. Я почти уверен, что причина, по которой это работает, связана с тем, что пакеты NuGet компилируются прямо для VS2017 и, таким образом, полностью исключаются любые проблемы сборки/компиляции между VS2017 и VS2015.

Спасибо за подсказки и комментарии! На самом деле указал мне, чтобы копнуть немного глубже в некоторые другие идеи и найти решение!!

person theQuantumMechanic    schedule 18.03.2018