Страницы

Поиск по вопросам

Показаны сообщения с ярлыком линковка. Показать все сообщения
Показаны сообщения с ярлыком линковка. Показать все сообщения

воскресенье, 9 февраля 2020 г.

Как прилинковать нестандартную версию protobuf используя cmake

#cpp #cmake #protobuf #кросс_компиляция #линковка


Есть проект под arm который компилируется и собирается на х86ой машине (кросскомпиляция).
Есть версия библиотеки protobuf собранная под arm по этой 
инструкции. В cmake файле я пытаюсь явно указать местоположение собранной под arm
библиотеки через переменную Protobuf_SRC_ROOT_FOLDER но похоже что cmake эта переменная
вообще побоку. Что мне сделать что бы find_package(Protobuf REQUIRED) нашёл ту версию
protobuf которая мне нужна?

cmake_minimum_required(VERSION 2.8)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -Wall -pthread ") #-lboost_system
project(proto_test)

# Подключаем протобуф 
set (Protobuf_SRC_ROOT_FOLDER "/home/mrfieldy/prot_build/protobuf-3.5.1-arm/src")  
#set (Protobuf_USE_STATIC_LIBS ON)   
find_package(Protobuf REQUIRED)
include_directories(${PROTOBUF_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS test.proto)
add_executable(${PROJECT_NAME} test.pb.cc ${PROTO_SRCS} ${PROTO_HDRS} "main.cpp")
target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES})




Ответ:

В общем, как посоветовали ниже, я выбрал путь сначала выполнить find_package, а потом
с помошью set переопределить пути. Долго искал на какие пути надо переопределить. Вот
рабочий вариант.

cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -Wall -pthread ")
project(proto_test)
# Подключаем протобуф 
find_package(Protobuf REQUIRED)
set (PROTOBUF_INCLUDE_DIRS "/home/mrfieldy/prot_build/protobuf-3.6.0-arm/src/")
set (PROTOBUF_LIBRARIES "/home/mrfieldy/prot_build/protobuf-3.6.0-arm/src/.libs/libprotobuf.so")
include_directories(${PROTOBUF_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
#protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS test.proto)
add_executable(${PROJECT_NAME} test.pb.cc ${PROTO_SRCS} ${PROTO_HDRS} "main.cpp")
target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES})

    


Ответы

Ответ 1



Поискал по переменной Protobuf_SRC_ROOT_FOLDER и нашел вот что: FindProtobuf К сожалению мой английский sehr schlecht, но, насколько я понял у вас версия cmake слишком низкая (документация там начинается с 3.02), а сама переменная касается лишь определенного случая, касающегося Visual Studio и, что-то мне подсказывает, это не то, что вы используете. Посоветую написать Find-файл самому - это довольно просто

Ответ 2



У нас похожая ситуация, только QtCreator. Может поможет. Это переменные конфигурации CMake А это toolchain (если собирать не в QtCreator, а в консоли): set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) set(buildrootdir /home/vegorov/Build-Root/04.06.2018/BR-opo) set(buildtriplet arm-buildroot-linux-gnueabihf) set(CMAKE_SYSROOT ${buildrootdir}/output/host/${buildtriplet}/sysroot) set(CMAKE_STAGING_PREFIX ${buildroot}/output/spo-stage) set(tools ${buildrootdir}/output/host/) set(CMAKE_C_COMPILER ${tools}/bin/${buildtriplet}-gcc) set(CMAKE_CXX_COMPILER ${tools}/bin/${buildtriplet}-g++) set(PROTOBUF_PROTOC_EXECUTABLE "${tools}bin/protoc") set(CMAKE_PREFIX_PATH ${buildrootdir}/output/host/${buildtriplet}/sysroot/usr/lib/cmake) set(OE_QMAKE_PATH_EXTERNAL_HOST_BINS ${tools}/bin/) set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) set(COMPILER_FLAGS "--sysroot=${CMAKE_SYSROOT} -O2 -march=armv7-a -marm -mfpu=vfpv3-d16 -mfloat-abi=hard -mcpu=cortex-a9") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMPILER_FLAGS}" CACHE STRING "" FORCE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMPILER_FLAGS}" CACHE STRING "" FORCE) #set(envpath $ENV{PATH}) #set(ENV{PATH} "${tools}bin:${envpath}" ) #message(STATUS ":${tools}bin:${envpath}")

воскресенье, 29 декабря 2019 г.

Как компилятор/линкер обходится без объектных файлов для template-классов?

#cpp #шаблоны_с++ #компиляция #линковка


Собственно в этом вопрос, до неприличия простой, но в гугле не нашел ответа. Компилируя
в qtcreator'e заметил, что для шаблонных классов нет соответствующих .o файлов. Ладно,
понятно, что нет соответствующего .cpp, но ведь по идее шаблонный класс при использовании
динамически генерирует "нормальный" класс с соответствующими типовыми параметрами,
так? И как функции этого класса "попадают" в исполняемый файл без посредничества объектных?
Напрямую? Если объектные файлы так ненеобходимы, то для чего они вообще до сих пор?
    


Ответы

Ответ 1



объектные файлы генерируются не для классов, а для единиц трансляции; тело инстанцированных шаблонов помещается в единицу трансляции, которая их инстанцирует; никто не заставляет явно создавать и использовать объектные файлы, большинство компиляторов позволяют сразу собрать исполняемый файл

понедельник, 16 декабря 2019 г.

Каким образом линкер решает проблему с ODR для шаблонов?

#cpp #шаблоны_с++ #компиляция #линковка


Каким образом линкер решает проблему с ODR для шаблонов? Ведь в каждом translation
unit у нас должна быть инстанциация шаблона (т.е. в каждом объектном файле, который
линкер должен собрать).
    


Ответы

Ответ 1



Для шаблонов нет никакой "проблемы с ODR". ODR также работает и для шаблонов: 6.2 One-definition rule 1. No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template. т.е. в одной единице трансляции не может быть нескольких определений шаблона: template struct Some {}; template struct Some {};//Ошибка Что касается определений в разных единицах трансляции (не только шаблоны), то они могут появляться, если удовлетворяют ряду требований. There can be more than one definition of a class type (Clause 10), enumeration type (9.6), inline function with external linkage (9.1.6), inline variable with external linkage (9.1.6), class template (Clause 12), non-static function template (12.6.6), concept (12.6.8), static data member of a class template (12.6.1.3), member function of a class template (12.6.1.1), or template specialization for which some template parameters are not specified (12.8, 12.6.5) in a program provided that each definition appears in a different translation unit, and provided the definitions satisfy the following requirements. Given such an entity named D defined in more than one translation unit, then список требований, который вряд ли имеет смысл приводить в данном ответе, т.к. предполагаем, что шаблон им всем удовлетворяет If D is a template and is defined in more than one translation unit, then the preceding requirements shall apply both to names from the template’s enclosing scope used in the template definition (12.7.3), and also to dependent names at the point of instantiation (12.7.2). If the definitions of D satisfy all these requirements, then the behavior is as if there were a single definition of D. [Note: The entity is still declared in multiple translation units, and 6.5 still applies to these declarations. In particular, lambda-expressions (7.5.5) appearing in the type of D may result in the different declarations having distinct types. — end note] If the definitions of D do not satisfy these requirements, then the behavior is undefined. т.е. при множественном определении шаблона в разных единицах трансляции поведение такое же, как если бы определение было всего одно. Как конкретно это будет делать реализация стандарт не уточняет. В C++ используется декорирование имен (name mangling, name decoration), поэтому при инстанцировании шаблона с заданным набором аргументов, имена полученных определений будут искажены. Одинаковые имена этих определений будут указывать на то, что это повторяющееся определение, полученное при инстанцировании шаблона, соответственно линковщик в праве оставить лишь одно из них, удалив всё лишнее.

понедельник, 2 декабря 2019 г.

Почему inline-функции, определённые в заголовочных файлах не дублируются при линковке?

#cpp #функции #inline #линковка


Я прочёл такой факт насчёт "обычных" и inline- функций:


  В предыдущих главах мы не раз говорили, что вы не должны определять функции в заголовочных
файлах, так как если вы подключаете один заголовок с определением функции в несколько
файлов .cpp, то определение функции также будет скопировано несколько раз. Затем, при
соединении файлов, линкер выдаст ошибку, что вы определяете одну и ту же функцию больше
одного раза.
  
  Однако, встроенные функции освобождаются от этого правила, так как дублирования
в исходном коде не происходит — определение функции одно, и никакого конфликта при
соединении линкером файлов .cpp возникнуть не должно.


Почему нельзя определять функции в header'е, понятно: произойдёт "multiple definition"
при линковке нескольких модулей, включающих этот хэдер. Но из текста совсем не понятно,
почему это правило не работает для inline-функций. Я понял это так: "inline-функции
не дублируются, потому что они не дублируются". Бред.

Я, конечно, могу принять во внимание этот факт как должное, и всё, но всё таки хочется
понять, почему так происходит, а исчерпывающего объяснения этот текст не даёт.
    


Ответы

Ответ 1



Если inline-функция реально была заинлайнена, то её как бы и нету, поэтому она не может дублироваться в принципе. Если же она не была заинлайнена после оптимизаций, то она получает уникальное имя в каждой единице трансляции, в итоге мы имеем много функций, которые делают одно и то же, но имеют разные имена. Так как имена в итоге разные, multiple definition не происходит. Подробнее читать здесь: Стандарт C++11, 3.2.5 (One definition rule), 7.1.2 (Function specifiers). Где взять стандарт C++?

Ответ 2



Если спецификация языка говорит, что ошибки быть не должно, значит ошибки быть не должно. А дальше уже начинаются детали реализации. Почему вы решили, что они не дублируются? В классической реализации инлайновые функции с внешним связыванием для которых компилятор при компиляции нескольких единиц трансляции решил сгенерировать тела, разумеется, дублируются. В процессе компиляции каждая единица трансляции получает свою копию такой функции в своем объектном файле с одним и тем же именем. Однако такие функции в объектном файле помечены особым образом - так, чтобы при обнаружении множества копий одного и тот же внешнего символа при линковке линкер не выдавал ошибки, а наоборот молча удалял все копии, оставляя только одну. То есть компилятор C++ генерирует "свалку" одинаково именованных функций, раскиданных по разным объектным файлам, а линкер потом собирает всё вместе и занимается чисткой этой "свалки". В компиляторах семейства *nix эта пометка - это обозначение экспортируемого символа, как т.наз. "слабого" (weak) символа. В компиляторе MSVC++ существует аналогичная пометка selectany. Линкеры выдают ошибку множественного определения только если встретят два или более одинаковых "сильных" символа в процессе линковки. Если же "сильный" символ только один (а остальные "слабые"), то побеждает "сильный" символ, а "слабые" символы отбрасываются. Если "сильного" символа нет вообще, а есть только "слабые", то побеждает один (какой-то) из "слабых". Никакой ошибки при этом не рапортуется. Когда компилятор решает сгенерировать тело для inline-функции с внешним связыванием, он просто помечает соответствующий символ для линкера как "слабый" - и все. (На этом же механизме построена трансляция шаблонных функций, которые, как известно, тоже определяются в заголовочных файлах и тоже порождают свои копии во всех объектных файлах, которые потребовали их инстанцирования.) Например, скомпилировав вот такой простой исходник в объектный файл inline void bar() {} void (*foo())() { return bar; } и просмотрев содержимое этого объектного файла при помощи nm мы увидим 0000000000000000 W _Z3barv 0000000000000000 T _Z3foov Буковка W помечает "слабый" символ, а буковка T - "сильный" символ. Во всех объектных файлах, в которых сгенерировалось тело для такой inline функции, она будет фигурировать под одним и тем же именем _Z3barv с пометкой W. Обратите внимание, что ни о каком решении этой проблемы через генерацию множества функций с разными именами не может быть и речи: в всех остальных отношениях инлайновая функция с внешним связыванием должна вести себя так же как и любая другая функция с внешним связыванием, т.е., например, она обязана иметь один и тот же адрес во всех единицах трансляции. Побочным эффектом такого подхода является то, что "классический" подход к формированию объектного файла, в котором у функции нет начала и конца, а есть только точка входа, становится неприемлем. Для того, чтобы иметь возможность исключать функции из объектного файла, С++ компиляторы вынуждены формировать тела функций в объектном файле в компактном виде. Существуют исторические примеры альтернативных реализаций, которые пытались действовать по-другому. "Многопроходные" реализации вообще не порождали тел для инлайновых и шаблонных функций на первом проходе компиляции. Они выполняли предварительную линковку, на которой собирали информацию о том, каким функциям действительно нужны тела, затем снова вызывали компилятор и компилировали уникальные тела для таких функций, и затем уже выполняли финальную линковку. Но среди популярных компиляторов (GCC/Clang/MSVC) такой подход не прижился.

пятница, 12 июля 2019 г.

Не линкуется Win API проект

Не могу подключить библиотеку comctl32. Точнее, она подключается, но:
undefined reference to `InitCommonControlsEx@4' collect2.exe: error: ld returned 1 exit status
Заголовки подключаются нормально:
#include #define _WIN32_IE 0x0600 #include
Сама библиотека лежит здесь:
C:\MinGW\lib\libcomctl32.a
Собираю так:
gcc.exe -std=c11 -m32 -Wall -Wextra -Wpedantic -mwindows -lcomctl32 -lbass main.c -o main.exe
Пробовал обновлять MinGW - безрезультатно.
ОС: Windows 10 x64
Компилятор: gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)
UPD
Может это поможет:
nm C:\MinGW\lib\libcomctl32.a > nm_results.txt
dvbpbt.o: 00000000 I __libcomctl32_a_iname
dvbpbh.o: 00000000 i .idata$4 00000000 i .idata$5 00000000 I __head_libcomctl32_a U __libcomctl32_a_iname
dvbpbs00113.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp___TrackMouseEvent@4 00000000 T __TrackMouseEvent@4
dvbpbs00112.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__Str_SetPtrW@8 00000000 T _Str_SetPtrW@8
dvbpbs00111.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__Str_SetPtrA@8 00000000 T _Str_SetPtrA@8
dvbpbs00110.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__Str_GetPtrW@12 00000000 T _Str_GetPtrW@12
dvbpbs00109.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__Str_GetPtrA@12 00000000 T _Str_GetPtrA@12
dvbpbs00108.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ShowHideMenuCtl@12 00000000 T _ShowHideMenuCtl@12
dvbpbs00107.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__SetWindowSubclass@16 00000000 T _SetWindowSubclass@16
dvbpbs00106.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__SendNotifyEx@20 00000000 T _SendNotifyEx@20
dvbpbs00105.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__SendNotify@16 00000000 T _SendNotify@16
dvbpbs00104.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__RemoveWindowSubclass@12 00000000 T _RemoveWindowSubclass@12
dvbpbs00103.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ReAlloc@8 00000000 T _ReAlloc@8
dvbpbs00102.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__PropertySheetW@4 00000000 T _PropertySheetW@4
dvbpbs00101.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__PropertySheetA@4 00000000 T _PropertySheetA@4
dvbpbs00100.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__PropertySheet@4 00000000 T _PropertySheet@4
dvbpbs00099.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__MenuHelp@28 00000000 T _MenuHelp@28
dvbpbs00098.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__MakeDragList@4 00000000 T _MakeDragList@4
dvbpbs00097.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__LBItemFromPt@16 00000000 T _LBItemFromPt@16
dvbpbs00096.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__InitMUILanguage@4 00000000 T _InitMUILanguage@4
dvbpbs00095.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__InitCommonControlsEx@4 00000000 T _InitCommonControlsEx@4
dvbpbs00094.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__InitCommonControls@0 00000000 T _InitCommonControls@0
dvbpbs00093.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Write@8 00000000 T _ImageList_Write@8
dvbpbs00092.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_SetOverlayImage@12 00000000 T _ImageList_SetOverlayImage@12
dvbpbs00091.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_SetImageCount@8 00000000 T _ImageList_SetImageCount@8
dvbpbs00090.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_SetIconSize@12 00000000 T _ImageList_SetIconSize@12
dvbpbs00089.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_SetDragCursorImage@16 00000000 T _ImageList_SetDragCursorImage@16
dvbpbs00088.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_SetBkColor@8 00000000 T _ImageList_SetBkColor@8
dvbpbs00087.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_ReplaceIcon@12 00000000 T _ImageList_ReplaceIcon@12
dvbpbs00086.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Replace@16 00000000 T _ImageList_Replace@16
dvbpbs00085.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Remove@8 00000000 T _ImageList_Remove@8
dvbpbs00084.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Read@4 00000000 T _ImageList_Read@4
dvbpbs00083.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Merge@24 00000000 T _ImageList_Merge@24
dvbpbs00082.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_LoadImageW@28 00000000 T _ImageList_LoadImageW@28
dvbpbs00081.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_LoadImageA@28 00000000 T _ImageList_LoadImageA@28
dvbpbs00080.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_LoadImage@28 00000000 T _ImageList_LoadImage@28
dvbpbs00079.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_GetImageRect@12 00000000 T _ImageList_GetImageRect@12
dvbpbs00078.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_GetImageInfo@12 00000000 T _ImageList_GetImageInfo@12
dvbpbs00077.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_GetImageCount@4 00000000 T _ImageList_GetImageCount@4
dvbpbs00076.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_GetIconSize@12 00000000 T _ImageList_GetIconSize@12
dvbpbs00075.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_GetIcon@12 00000000 T _ImageList_GetIcon@12
dvbpbs00074.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_GetDragImage@8 00000000 T _ImageList_GetDragImage@8
dvbpbs00073.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_GetBkColor@4 00000000 T _ImageList_GetBkColor@4
dvbpbs00072.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_EndDrag@0 00000000 T _ImageList_EndDrag@0
dvbpbs00071.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Duplicate@4 00000000 T _ImageList_Duplicate@4
dvbpbs00070.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_DrawIndirect@4 00000000 T _ImageList_DrawIndirect@4
dvbpbs00069.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_DrawEx@40 00000000 T _ImageList_DrawEx@40
dvbpbs00068.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Draw@24 00000000 T _ImageList_Draw@24
dvbpbs00067.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_DragShowNolock@4 00000000 T _ImageList_DragShowNolock@4
dvbpbs00066.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_DragMove@8 00000000 T _ImageList_DragMove@8
dvbpbs00065.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_DragLeave@4 00000000 T _ImageList_DragLeave@4
dvbpbs00064.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_DragEnter@12 00000000 T _ImageList_DragEnter@12
dvbpbs00063.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Destroy@4 00000000 T _ImageList_Destroy@4
dvbpbs00062.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Create@20 00000000 T _ImageList_Create@20
dvbpbs00061.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Copy@20 00000000 T _ImageList_Copy@20
dvbpbs00060.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_BeginDrag@16 00000000 T _ImageList_BeginDrag@16
dvbpbs00059.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_AddMasked@12 00000000 T _ImageList_AddMasked@12
dvbpbs00058.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_AddIcon@8 00000000 T _ImageList_AddIcon@8
dvbpbs00057.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__ImageList_Add@12 00000000 T _ImageList_Add@12
dvbpbs00056.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__GetWindowSubclass@16 00000000 T _GetWindowSubclass@16
dvbpbs00055.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__GetSize@4 00000000 T _GetSize@4
dvbpbs00054.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__GetMUILanguage@0 00000000 T _GetMUILanguage@0
dvbpbs00053.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__GetEffectiveClientRect@12 00000000 T _GetEffectiveClientRect@12
dvbpbs00052.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__FreeMRUList@4 00000000 T _FreeMRUList@4
dvbpbs00051.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__Free@4 00000000 T _Free@4
dvbpbs00050.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__FindMRUStringW@12 00000000 T _FindMRUStringW@12
dvbpbs00049.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__FindMRUStringA@12 00000000 T _FindMRUStringA@12
dvbpbs00048.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__FindMRUData@16 00000000 T _FindMRUData@16
dvbpbs00047.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__EnumMRUListW@16 00000000 T _EnumMRUListW@16
dvbpbs00046.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__EnumMRUListA@16 00000000 T _EnumMRUListA@16
dvbpbs00045.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DrawStatusTextW@16 00000000 T _DrawStatusTextW@16
dvbpbs00044.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DrawStatusTextA@16 00000000 T _DrawStatusTextA@16
dvbpbs00043.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DrawStatusText@16 00000000 T _DrawStatusText@16
dvbpbs00042.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DrawInsert@12 00000000 T _DrawInsert@12
dvbpbs00041.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DestroyPropertySheetPage@4 00000000 T _DestroyPropertySheetPage@4
dvbpbs00040.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DelMRUString@8 00000000 T _DelMRUString@8
dvbpbs00039.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DefSubclassProc@16 00000000 T _DefSubclassProc@16
dvbpbs00038.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_SetItem@12 00000000 T _DSA_SetItem@12
dvbpbs00037.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_InsertItem@12 00000000 T _DSA_InsertItem@12
dvbpbs00036.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_GetItemPtr@8 00000000 T _DSA_GetItemPtr@8
dvbpbs00035.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_GetItem@12 00000000 T _DSA_GetItem@12
dvbpbs00034.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_Destroy@4 00000000 T _DSA_Destroy@4
dvbpbs00033.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_DeleteItem@8 00000000 T _DSA_DeleteItem@8
dvbpbs00032.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_DeleteAllItems@4 00000000 T _DSA_DeleteAllItems@4
dvbpbs00031.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DSA_Create@8 00000000 T _DSA_Create@8
dvbpbs00030.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_Sort@12 00000000 T _DPA_Sort@12
dvbpbs00029.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_SetPtr@12 00000000 T _DPA_SetPtr@12
dvbpbs00028.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_Search@24 00000000 T _DPA_Search@24
dvbpbs00027.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_InsertPtr@12 00000000 T _DPA_InsertPtr@12
dvbpbs00026.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_Grow@8 00000000 T _DPA_Grow@8
dvbpbs00025.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_GetPtrIndex@8 00000000 T _DPA_GetPtrIndex@8
dvbpbs00024.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_GetPtr@8 00000000 T _DPA_GetPtr@8
dvbpbs00023.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_Destroy@4 00000000 T _DPA_Destroy@4
dvbpbs00022.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_DeletePtr@8 00000000 T _DPA_DeletePtr@8
dvbpbs00021.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_DeleteAllPtrs@4 00000000 T _DPA_DeleteAllPtrs@4
dvbpbs00020.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_CreateEx@8 00000000 T _DPA_CreateEx@8
dvbpbs00019.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_Create@4 00000000 T _DPA_Create@4
dvbpbs00018.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__DPA_Clone@8 00000000 T _DPA_Clone@8
dvbpbs00017.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateUpDownControl@48 00000000 T _CreateUpDownControl@48
dvbpbs00016.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateToolbarEx@52 00000000 T _CreateToolbarEx@52
dvbpbs00015.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateToolbar@32 00000000 T _CreateToolbar@32
dvbpbs00014.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateStatusWindowW@16 00000000 T _CreateStatusWindowW@16
dvbpbs00013.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateStatusWindowA@16 00000000 T _CreateStatusWindowA@16
dvbpbs00012.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateStatusWindow@16 00000000 T _CreateStatusWindow@16
dvbpbs00011.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateProxyPage@8 00000000 T _CreateProxyPage@8
dvbpbs00010.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreatePropertySheetPageW@4 00000000 T _CreatePropertySheetPageW@4
dvbpbs00009.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreatePropertySheetPageA@4 00000000 T _CreatePropertySheetPageA@4
dvbpbs00008.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreatePropertySheetPage@4 00000000 T _CreatePropertySheetPage@4
dvbpbs00007.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreatePage@8 00000000 T _CreatePage@8
dvbpbs00006.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateMappedBitmap@20 00000000 T _CreateMappedBitmap@20
dvbpbs00005.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateMRUListW@4 00000000 T _CreateMRUListW@4
dvbpbs00004.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__CreateMRUListA@4 00000000 T _CreateMRUListA@4
dvbpbs00003.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__Alloc@4 00000000 T _Alloc@4
dvbpbs00002.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__AddMRUStringW@8 00000000 T _AddMRUStringW@8
dvbpbs00001.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__AddMRUStringA@8 00000000 T _AddMRUStringA@8
dvbpbs00000.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__AddMRUData@12 00000000 T _AddMRUData@12

Упоминание InitCommonControlsEx@4 из верхнего листинга:
dvbpbs00095.o: 00000000 i .idata$5 00000000 i .idata$6 U __head_libcomctl32_a 00000000 I __imp__InitCommonControlsEx@4 00000000 T _InitCommonControlsEx@4
Пробовал скачивать разные версии libcomctl32.a отсюда: https://sourceforge.net/projects/mingw/files/MinGW/Base/w32api/. Безрезультатно.
UPD 2
Вывод nm для main.exe
nm main.exe 00000000 b .bss 00000000 d .data 00000000 i .drectve 00000000 r .eh_frame 00000000 r .rdata 00000000 r .rdata$zzz 00000000 t .text U ___mingw_vprintf 00000004 C _BASS_Apply3D 00000004 C _BASS_ChannelBytes2Seconds 00000004 C _BASS_ChannelFlags 00000004 C _BASS_ChannelGet3DAttributes 00000004 C _BASS_ChannelGet3DPosition 00000004 C _BASS_ChannelGetAttribute 00000004 C _BASS_ChannelGetData 00000004 C _BASS_ChannelGetDevice 00000004 C _BASS_ChannelGetInfo 00000004 C _BASS_ChannelGetLength 00000004 C _BASS_ChannelGetLevel 00000004 C _BASS_ChannelGetPosition 00000004 C _BASS_ChannelGetTags 00000004 C _BASS_ChannelIsActive 00000004 C _BASS_ChannelIsSliding 00000004 C _BASS_ChannelLock 00000004 C _BASS_ChannelPause 00000004 C _BASS_ChannelPlay 00000004 C _BASS_ChannelRemoveDSP 00000004 C _BASS_ChannelRemoveFX 00000004 C _BASS_ChannelRemoveLink 00000004 C _BASS_ChannelRemoveSync 00000004 C _BASS_ChannelSeconds2Bytes 00000004 C _BASS_ChannelSet3DAttributes 00000004 C _BASS_ChannelSet3DPosition 00000004 C _BASS_ChannelSetAttribute 00000004 C _BASS_ChannelSetDevice 00000004 C _BASS_ChannelSetDSP 00000004 C _BASS_ChannelSetFX 00000004 C _BASS_ChannelSetLink 00000004 C _BASS_ChannelSetPosition 00000004 C _BASS_ChannelSetSync 00000004 C _BASS_ChannelSlideAttribute 00000004 C _BASS_ChannelStop 00000004 C _BASS_ChannelUpdate 00000004 C _BASS_ErrorGetCode 00000004 C _BASS_Free 00000004 C _BASS_FXGetParameters 00000004 C _BASS_FXReset 00000004 C _BASS_FXSetParameters 00000004 C _BASS_Get3DFactors 00000004 C _BASS_Get3DPosition 00000004 C _BASS_GetConfig 00000004 C _BASS_GetConfigPtr 00000004 C _BASS_GetCPU 00000004 C _BASS_GetDevice 00000004 C _BASS_GetDeviceInfo 00000004 C _BASS_GetDSoundObject 00000004 C _BASS_GetEAXParameters 00000004 C _BASS_GetInfo 00000004 C _BASS_GetVersion 00000004 C _BASS_GetVolume 00000004 C _BASS_Init 00000004 C _BASS_MusicFree 00000004 C _BASS_MusicLoad 00000004 C _BASS_Pause 00000004 C _BASS_PluginFree 00000004 C _BASS_PluginGetInfo 00000004 C _BASS_PluginLoad 00000004 C _BASS_RecordFree 00000004 C _BASS_RecordGetDevice 00000004 C _BASS_RecordGetDeviceInfo 00000004 C _BASS_RecordGetInfo 00000004 C _BASS_RecordGetInput 00000004 C _BASS_RecordGetInputName 00000004 C _BASS_RecordInit 00000004 C _BASS_RecordSetDevice 00000004 C _BASS_RecordSetInput 00000004 C _BASS_RecordStart 00000004 C _BASS_SampleCreate 00000004 C _BASS_SampleFree 00000004 C _BASS_SampleGetChannel 00000004 C _BASS_SampleGetChannels 00000004 C _BASS_SampleGetData 00000004 C _BASS_SampleGetInfo 00000004 C _BASS_SampleLoad 00000004 C _BASS_SampleSetData 00000004 C _BASS_SampleSetInfo 00000004 C _BASS_SampleStop 00000004 C _BASS_Set3DFactors 00000004 C _BASS_Set3DPosition 00000004 C _BASS_SetConfig 00000004 C _BASS_SetConfigPtr 00000004 C _BASS_SetDevice 00000004 C _BASS_SetEAXParameters 00000004 C _BASS_SetVolume 00000004 C _BASS_Start 00000004 C _BASS_Stop 00000004 C _BASS_StreamCreate 00000004 C _BASS_StreamCreateFile 00000004 C _BASS_StreamCreateFileUser 00000004 C _BASS_StreamCreateURL 00000004 C _BASS_StreamFree 00000004 C _BASS_StreamGetFilePosition 00000004 C _BASS_StreamPutData 00000004 C _BASS_StreamPutFileData 00000004 C _BASS_Update U _CreateWindowExW@48 00000220 D _current_sound U _DefWindowProcW@16 U _DispatchMessageA@4 U _exit 00000020 D _genres U _GetMessageA@16 U _GetProcAddress@8 U _GetSysColorBrush@4 U _InitCommonControlsEx@4 U _LoadCursorA@8 U _LoadLibraryA@4 U _malloc 0000001c C _msg U _PostQuitMessage@4 00000000 t _printf 0000022a T _qk_CheckBASSVersion 00000004 C _qk_cmd_line 00000004 C _qk_cmd_show 000008b2 T _qk_CreateMainWindow 00000782 T _qk_DecreasePos 000004b0 T _qk_DecreaseVol 000002ef T _qk_GetCPULoad 0000082a T _qk_GetSoundAlbum 0000080d T _qk_GetSoundArtist 00000698 T _qk_GetSoundCurrentMinute 000006b1 T _qk_GetSoundCurrentSecond 00000864 T _qk_GetSoundGenre 000005ea T _qk_GetSoundLengthInBytes 000005fa T _qk_GetSoundLengthInSeconds 00000604 T _qk_GetSoundPosInBytes 00000627 T _qk_GetSoundPosInSeconds 00000413 T _qk_GetSoundState 000007f0 T _qk_GetSoundTitle 00000847 T _qk_GetSoundYear 0000041d T _qk_GetVol 00000004 C _qk_hinstance 00000718 T _qk_IncreasePos 0000044f T _qk_IncreaseVol 00000279 T _qk_InitBASS 00000029 T _qk_LoadBASSFunctions 00000318 T _qk_LoadSound 0000050f t _qk_LoadSoundLength 00000260 D _qk_main_win_title 00000018 C _qk_main_window 000003ed T _qk_PauseSound 000003bf T _qk_PlaySound 00000004 C _qk_sample_rate 000006d5 T _qk_SetPos 0000030a T _qk_SetSampleRate U _RegisterClassW@4 U _SendMessageW@16 00000004 D _tags_unknown_album 00000008 D _tags_unknown_artist 0000000c D _tags_unknown_title 00000000 D _tags_unknown_year U _TranslateMessage@4 U _wcscpy U _wcslen 00000ce9 T _WinMain@16 00000a02 T _WndProc@16
Из верхнего листинга:
00000020 D _genres U _GetMessageA@16 U _GetProcAddress@8 U _GetSysColorBrush@4 U _InitCommonControlsEx@4 <----------------- U _LoadCursorA@8 U _LoadLibraryA@4 U _malloc


Ответ

В общем, нашел решение здесь здесь
-lcomctl32 -luxtheme Put these after main.cpp
Т.е., в моем случае:
Было:
gcc.exe -std=c11 -m32 -Wall -Wextra -Wpedantic -mwindows -lcomctl32 -lbass main.c -o main.exe
Стало:
gcc.exe -std=c11 -m32 -Wall -Wextra -Wpedantic -mwindows -lbass main.c -lcomctl32 -o main.exe
Поместил -lcomctl32 после main.c

понедельник, 15 апреля 2019 г.

Как прилинковать нестандартную версию protobuf используя cmake

Есть проект под arm который компилируется и собирается на х86ой машине (кросскомпиляция). Есть версия библиотеки protobuf собранная под arm по этой инструкции. В cmake файле я пытаюсь явно указать местоположение собранной под arm библиотеки через переменную Protobuf_SRC_ROOT_FOLDER но похоже что cmake эта переменная вообще побоку. Что мне сделать что бы find_package(Protobuf REQUIRED) нашёл ту версию protobuf которая мне нужна?
cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -Wall -pthread ") #-lboost_system project(proto_test)
# Подключаем протобуф set (Protobuf_SRC_ROOT_FOLDER "/home/mrfieldy/prot_build/protobuf-3.5.1-arm/src") #set (Protobuf_USE_STATIC_LIBS ON) find_package(Protobuf REQUIRED) include_directories(${PROTOBUF_INCLUDE_DIRS}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS test.proto) add_executable(${PROJECT_NAME} test.pb.cc ${PROTO_SRCS} ${PROTO_HDRS} "main.cpp") target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES})

Ответ:
В общем, как посоветовали ниже, я выбрал путь сначала выполнить find_package, а потом с помошью set переопределить пути. Долго искал на какие пути надо переопределить. Вот рабочий вариант.
cmake_minimum_required(VERSION 2.8) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -Wall -pthread ") project(proto_test) # Подключаем протобуф find_package(Protobuf REQUIRED) set (PROTOBUF_INCLUDE_DIRS "/home/mrfieldy/prot_build/protobuf-3.6.0-arm/src/") set (PROTOBUF_LIBRARIES "/home/mrfieldy/prot_build/protobuf-3.6.0-arm/src/.libs/libprotobuf.so") include_directories(${PROTOBUF_INCLUDE_DIRS}) include_directories(${CMAKE_CURRENT_BINARY_DIR}) #protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS test.proto) add_executable(${PROJECT_NAME} test.pb.cc ${PROTO_SRCS} ${PROTO_HDRS} "main.cpp") target_link_libraries(${PROJECT_NAME} ${PROTOBUF_LIBRARIES})


Ответ

Поискал по переменной Protobuf_SRC_ROOT_FOLDER и нашел вот что:
FindProtobuf
К сожалению мой английский sehr schlecht, но, насколько я понял у вас версия cmake слишком низкая (документация там начинается с 3.02), а сама переменная касается лишь определенного случая, касающегося Visual Studio и, что-то мне подсказывает, это не то, что вы используете.
Посоветую написать Find-файл самому - это довольно просто