Форум на Kuban.ru (http://forums.kuban.ru/)
-   Разработка программ (http://forums.kuban.ru/f1024/)
-   -   Посоветуйте хорошую книгу по линковщику C++ (http://forums.kuban.ru/f1024/posovetujte_horoshuyu_knigu_po_linkovshiku_c-8159782.html)

megabax 16.01.2017 20:47

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

max 21.01.2017 10:36

0-megabax > Да в принципе Страуструпа и Александреску хватить должно. Стандарт почитать не предлагаю. :)
Кстати, основные ошибки это unresolved external и already defined. Причины и тех и других обычно ясны.
ЗЫ: Какой величины проект, что тебя так это взволновало, что прямо книгу захотелось почитать? :)

max 21.01.2017 10:37

+ есть куча статей, на Хабре том же.

megabax 23.01.2017 15:04

1-Нас не забанить > Эта магистерская диссертация. Написал прогу на C#, затем понадобилось подключить несколько функций из OpenCV. Попдытася исользовать NuGet пакеты, вроед OpenCV подключил, но оказалось, что почему то оттуда эти функции не доступны. Сделал временный костыль: написал на C++ прогу, которая запускается из основной проги на шарпе и передает ей результат работы виде файла. Потом все-таки хотел сделать нормально, вызов из проги C# подпрограмма на C++, засунув последнюю в dll-ку. Но при компиляии такой ll-ки возникли проблемы с линковкой, и я понял, что очень мало понимаю в c++, поэтому и захотелось почитать.

max 24.01.2017 11:44

3-megabax > Решение хорошее, поддерживаю. Давай ошибки в студию! :)

megabax 29.01.2017 16:05

4-Нас не забанить >Ошибку выдает вот такую:
"Ошибка 2 error LNK2019: ссылка на неразрешенный внешний символ _cvLoadImage в функции _MyProc D:\Самообразование\C++\DllDemo\MyLib\MyLib\MyLib.obj MyLib"

А вот программа:
"// MyLib.cpp: определяет экспортированные функции для приложения DLL.
//

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cv.h>
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;
using namespace cv;

IplImage* image = 0;
IplImage* src = 0;



extern "C" __declspec( dllexport ) int MyFunc(int parm1)
**
return parm1*2;
**

int InnerFunc1(int a)
**
return a+2;
**

extern "C" __declspec( dllexport ) int MyFunc1(int parm1)
**
return parm1*InnerFunc1(parm1);
**


extern "C" __declspec( dllexport ) int WriteToFile()
**
ofstream file;
file.open("D:\\1\\test_lib.txt",ios::out|ios::app);
if (!file) **
return -1;
**
file << "This is test C++ proc" << endl;
file.close();
return 1;
**

int InnerFunc2()
**
/*char* filename = "d:\\3\\Dscn0116.jpg";
Mat mat;*/

// получаем картинку
//image = cvLoadImage(filename,1);
return 1;
**

extern "C" __declspec( dllexport ) int MyProc()
**
// имя картинки задаётся первым параметром
char* filename = "d:\\3\\Dscn0116.jpg";

// получаем картинку
image = cvLoadImage(filename,1);
// клонируем картинку
/*src = cvCloneImage(image);

assert( src != 0 );

// окно для отображения картинки
cvNamedWindow("original",CV_WINDOW_AUTOSIZE);

// показываем картинку
cvShowImage("original",image);

// освобождаем ресурсы
cvReleaseImage(& image);
cvReleaseImage(&src);
// удаляем окно
cvDestroyWindow("original");*/
return 0;
**
"

wayerr 30.01.2017 00:06

Судя по всему линкеру надо указать где твоя dll-ка с cvLoadImage

max 30.01.2017 12:34

6-wayerr > Похоже на то.
5-megabax > Определение (тело) функции cvLoadImage у тебя где находится?

megabax 30.01.2017 20:23

Определение находиться в файле c:\opencv\build\include\opencv2\imgcodecs\imgcodecs_c.h
Тело функции, судя по всему, где то в библиотеке.
Каталоги с либами у меня указаны в настройках "Каталоги VC++" -> "Каталоги библиотек", там стоит: C:\opencv\build\x64\vc11\lib;C:\opencv\build\x86\vc11\lib;C:\opencv\build\x86\vc12\lib;C:\opencv\build\x64\vc12\lib;$(LibraryPath)
И, самое интересно, этот же самый код, помещенный в консольное приложение, отлично компилиться, запускается и работает. А в случае с dll-кой почему то даже компилиться не хочет.

max 30.01.2017 23:11

8-megabax > Тогда в imgcodec s_c.h не определение, а объявление (прототип функции).
Кроме каталогов с либами, нужно в на вкладке кажется Linker->Input прописать еще и конкретные либы в Additional Dependences(mylib1.lib;mylib2.lib).
Почему "этот же самый код, помещенный в консольное приложение, отлично компилиться, запускается и работает." навскидку не скажу.
Возможно, на самом деле в том проекте все либы корректно прописаны.


Текущее время: 18:07. Часовой пояс GMT +3.