К списку форумов К списку тем
Регистрация    Правила    Главная форума    Поиск   
Имя: Пароль:
Рекомендовать в новости

Посоветуйте хорошую книгу по линковщику C++

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


Гость
1 - 21.01.2017 - 10:36
0-megabax > Да в принципе Страуструпа и Александреску хватить должно. Стандарт почитать не предлагаю. :)
Кстати, основные ошибки это unresolved external и already defined. Причины и тех и других обычно ясны.
ЗЫ: Какой величины проект, что тебя так это взволновало, что прямо книгу захотелось почитать? :)
Гость
2 - 21.01.2017 - 10:37
+ есть куча статей, на Хабре том же.
Гость
3 - 23.01.2017 - 15:04
1-Нас не забанить > Эта магистерская диссертация. Написал прогу на C#, затем понадобилось подключить несколько функций из OpenCV. Попдытася исользовать NuGet пакеты, вроед OpenCV подключил, но оказалось, что почему то оттуда эти функции не доступны. Сделал временный костыль: написал на C++ прогу, которая запускается из основной проги на шарпе и передает ей результат работы виде файла. Потом все-таки хотел сделать нормально, вызов из проги C# подпрограмма на C++, засунув последнюю в dll-ку. Но при компиляии такой ll-ки возникли проблемы с линковкой, и я понял, что очень мало понимаю в c++, поэтому и захотелось почитать.
Гость
4 - 24.01.2017 - 11:44
3-megabax > Решение хорошее, поддерживаю. Давай ошибки в студию! :)
Гость
5 - 29.01.2017 - 16:05
4-Нас не забанить >Ошибку выдает вот такую:
"Ошибка 2 error LNK2019: ссылка на неразрешенный внешний символ _cvLoadImage в функции _MyProc D:\Самообразование\C++\DllDemo\MyLib\MyLib\MyLib.o bj 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;
**
"
Гость
6 - 30.01.2017 - 00:06
Судя по всему линкеру надо указать где твоя dll-ка с cvLoadImage
Гость
7 - 30.01.2017 - 12:34
6-wayerr > Похоже на то.
5-megabax > Определение (тело) функции cvLoadImage у тебя где находится?
Гость
8 - 30.01.2017 - 20:23
Определение находиться в файле c:\opencv\build\include\opencv2\imgcodecs\imgcodec s_c.h
Тело функции, судя по всему, где то в библиотеке.
Каталоги с либами у меня указаны в настройках "Каталоги VC++" -> "Каталоги библиотек", там стоит: C:\opencv\build\x64\vc11\lib;C:\opencv\build\x86\v c11\lib;C:\opencv\build\x86\vc12\lib;C:\opencv\bui ld\x64\vc12\lib;$(LibraryPath)
И, самое интересно, этот же самый код, помещенный в консольное приложение, отлично компилиться, запускается и работает. А в случае с dll-кой почему то даже компилиться не хочет.
Гость
9 - 30.01.2017 - 23:11
8-megabax > Тогда в imgcodec s_c.h не определение, а объявление (прототип функции).
Кроме каталогов с либами, нужно в на вкладке кажется Linker->Input прописать еще и конкретные либы в Additional Dependences(mylib1.lib;mylib2.lib).
Почему "этот же самый код, помещенный в консольное приложение, отлично компилиться, запускается и работает." навскидку не скажу.
Возможно, на самом деле в том проекте все либы корректно прописаны.


К списку вопросов






Copyright ©, Все права защищены